编写程序模拟2-3个事务并发执行,简单实现调度器功能:加锁(含更新锁),根据锁表判断事务是否可获得锁,解锁

Disk = {
    'A': 2,
    'B': 2,
}

Memory = {}

T = 10

flag = False


def r1(read_data):
    print('读取完成:' + read_data + '={}'.format(Disk[read_data]))


def r2(read_data):
    print('读取完成:' + read_data + '={}'.format(Disk[read_data]))


def w1(write_data):
    global T
    Disk[write_data] = T
    print('写入完成:' + write_data + '={}'.format(Disk[write_data]))


def print_now_lock_status(list):
    print(list)


lock_list = {
    "A": {
        'model': '默认',
        'Wait': False,
        'wait_list': {'Tran': '', 'Mode': '', 'wait': False, 'Tnext': None,
                      'Next': {'Tran': '', 'Mode': '', 'wait': False, 'Tnext': None, 'Next': None},
                      },
    },
    "B": {
        'model': '默认',
        'Wait': False,
        'wait_list': {'Tran': '', 'Mode': '', 'wait': False, 'Tnext': None,
                      'Next': {'Tran': '', 'Mode': '', 'wait': False, 'Tnext': None, 'Next': None},
                      },
    },
}


def print_now_status():
    print('锁表信息:')
    print(lock_list)


def sl1(element):
    print('Transaction1对元素A进行操作')
    print('锁表中不存在A的表项,可以加锁')
    lock_list[element]['model'] = 'S'
    lock_list[element]['wait_list']['Tran'] = 'T1'
    lock_list[element]['wait_list']['Mode'] = 'S'
    lock_list[element]['wait_list']['wait'] = False
    lock_list[element]['wait_list']['Tnext'] = None
    lock_list[element]['wait_list']['Next'] = {'Tran': '', 'Mode': '', 'wait': False, 'Tnext': None, 'Next': None}


def sl2(element):
    if lock_list[element]['model'] == 'U':
        print('Transaction2对元素{}进行操作'.format(element))
        print('锁表中元素{}的组模式为U,不可授予新的共享锁,请等待释放后再加锁!'.format(element))
        lock_list[element]['Wait'] = True
        lock_list[element]['wait_list']['Tran'] = 'T2'
        lock_list[element]['wait_list']['Mode'] = 'S'
        lock_list[element]['wait_list']['wait'] = True
        lock_list[element]['wait_list']['Tnext'] = None
        lock_list[element]['wait_list']['Next'] = None
        # lock_list[element]['wait_list'] = {{'Tran': 'T2', 'Mode': 'S', 'wait': True, 'Tnext': None, 'Next': None}, }
    elif lock_list[element]['model'] == 'X':
        print('Transaction2对元素{}进行操作'.format(element))
        print('锁表中元素{}的组模式为X,不可授予新的共享锁,请等待释放后再加锁!'.format(element))
        lock_list[element]['Wait'] = True
        lock_list[element]['wait_list']['Tran'] = 'T2'
        lock_list[element]['wait_list']['Mode'] = 'S'
        lock_list[element]['wait_list']['wait'] = True
        lock_list[element]['wait_list']['Tnext'] = None
        lock_list[element]['wait_list']['Next'] = None
        # lock_list[element]['wait_list'] = {{'Tran': 'T2', 'Mode': 'S', 'wait': True, 'Tnext': None, 'Next': None}, }
    else:

        if lock_list[element]['wait_list']['Tran'] == '':
            print('Transaction2对元素B进行操作')
            print('锁表中不存在B的表项,可以加锁')
            lock_list[element]['model'] = 'S'
            lock_list[element]['wait_list']['Tran'] = 'T2'
            lock_list[element]['wait_list']['Mode'] = 'S'
            lock_list[element]['wait_list']['wait'] = False
            lock_list[element]['wait_list']['Tnext'] = None
            lock_list[element]['wait_list']['Next'] = {'Tran': '', 'Mode': '', 'wait': False, 'Tnext': None,
                                                       'Next': None}
        else:
            print('Transaction2对元素{}进行操作'.format(element))
            print('锁表中元素{}的组模式为S,可以加共享锁'.format(element))
            lock_list[element]['model'] = 'S'
            lock_list[element]['wait_list']['Next']['Tran'] = 'T2'
            lock_list[element]['wait_list']['Next']['Mode'] = 'S'
            lock_list[element]['wait_list']['Next']['wait'] = False
            lock_list[element]['wait_list']['Next']['Tnext'] = None
            # lock_list['A']['wait_list']['Next'] = {'Tran': 'T2', 'Mode': 'S', 'wait': True, 'Tnext': None, 'Next': None}
            lock_list[element]['wait_list']['Next']['Next'] = None


def ul1(element):
    if lock_list[element]['model'] == 'S':
        print('可以加锁,组模式变为U')
        lock_list[element]['model'] = 'U'
        lock_list[element]['Wait'] = False
        lock_list[element]['wait_list']['Next']['Tran'] = 'T1'
        lock_list[element]['wait_list']['Next']['Mode'] = 'U'
        lock_list[element]['wait_list']['Next']['wait'] = False
        lock_list[element]['wait_list']['Next']['Tnext'] = None
        lock_list[element]['wait_list']['Next']['Next'] = {'Tran': '', 'Mode': '', 'wait': False, 'Tnext': None,
                                                           'Next': None}

    elif lock_list[element]['model'] == 'X':
        print('不可授予新的锁,请等待其他事务该元素后再加锁!')
        lock_list[element]['Wait'] = True
        lock_list[element]['wait_list']['Tran'] = 'T1'
        lock_list[element]['wait_list']['Mode'] = 'U'
        lock_list[element]['wait_list']['wait'] = True
        lock_list[element]['wait_list']['Tnext'] = None
        lock_list[element]['wait_list']['Next'] = {'Tran': '', 'Mode': '', 'wait': False, 'Tnext': None, 'Next': None}
    else:
        while True:
            if flag == True:
                if lock_list[element]['wait_list']['Next']['wait'] == False:
                    print('Transaction2已经释放该元素加了sl锁,所以事务1的ul锁可以升级为xl锁')
                    lock_list[element]['model'] = 'X'
                    lock_list[element]['Wait'] = False
                    lock_list[element]['wait_list']['Next']['Next']['Tran'] = 'T1'
                    lock_list[element]['wait_list']['Next']['Next']['Mode'] = 'X'
                    lock_list[element]['wait_list']['Next']['Next']['wait'] = False
                    lock_list[element]['wait_list']['Next']['Next']['Tnext'] = None
                    lock_list[element]['wait_list']['Next']['Next']['Next'] = None
                    global T
                    Disk[element] = T
                    # print(Disk[element])
                    break

            break


# 定义事务类
class Transaction:

    # 初始化
    def __init__(self, df, cmd):
        self.define = df
        self.command = cmd
        # self.flag = False

    def pause(self):
        print('执行一步 : 按n ')
        c = input()
        print(c)
        while (c != 'n'):
            print('输入错误')
            c = input()
            print(c)
        return c

    def excute(self):
        # self.print_cmd()
        print('初始锁表信息:')
        print_now_status()
        can_pause = True
        for cmd in self.command:
            if can_pause:
                c = self.pause()
                print('执行动作 {}'.format(cmd))
                exc_cmd = cmd
                exec(exc_cmd)
                print_now_status()


def xl1(element):
    if lock_list[element]['wait_list']['Tran'] != '':
        print('Transaction2已经对元素{}加了sl锁,所以事务1的ul锁不可以升级为xl锁'.format(element))
        lock_list[element]['Wait'] = True
        lock_list[element]['wait_list']['Next']['Next']['Tran'] = 'T1'
        lock_list[element]['wait_list']['Next']['Next']['Mode'] = 'U'
        lock_list[element]['wait_list']['Next']['Next']['wait'] = True
        lock_list[element]['wait_list']['Next']['Next']['Tnext'] = None
        lock_list[element]['wait_list']['Next']['Next']['Next'] = None


def u2(element):
    if element == 'A':
        lock_list['A']['wait_list']['Next'] = None
    elif element == 'B':
        lock_list['B']['wait_list']['Next']['wait'] = False
        lock_list['B']['wait_list']['Tran'] = ''
        lock_list['B']['wait_list']['Mode'] = ''
        global flag
        flag = True
        ul1('B')


def u1(element):
    if element == 'A':
        lock_list['A']['model'] = ''
        lock_list['A']['Wait'] = False
        lock_list['A']['wait_list'] = None
    elif element == 'B':
        lock_list['B']['model'] = ''
        lock_list['B']['Wait'] = False
        lock_list['B']['wait_list'] = None


if __name__ == "__main__":
    df3 = 'A = 2,B = 2'
    commend3 = ['sl1(\'A\')', 'r1(\'A\')', 'sl2(\'A\')', 'r2(\'A\')', 'sl2(\'B\')', 'r2(\'B\')', 'ul1(\'B\')',
                'r1(\'B\')', 'xl1(\'B\')', 'u2(\'A\')', 'u2(\'B\')', 'w1(\'B\')', 'u1(\'A\')', 'u1(\'B\')']
    Transaction3 = Transaction(df3, commend3)
    print('事务执行顺序:')
    print_now_lock_status(commend3)
    Transaction3.excute()