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
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
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[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
break
break
class Transaction:
def __init__(self, df, cmd):
self.define = df
self.command = cmd
def pause(self):
print('执行一步 : 按n ')
c = input()
print(c)
while (c != 'n'):
print('输入错误')
c = input()
print(c)
return c
def excute(self):
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()