发布网友 发布时间:2022-04-27 04:19
共1个回答
热心网友 时间:2022-04-09 11:15
这是个同一事务对同一数据对角加锁、解锁问题。追答搞得有点乱,我看了有十几分钟感觉前后你的问题不一样了,没想错的话前面应该第二问出现错误。我们先理清两个问题:1.共享锁的概念中说“其他事物只能对A加S锁,而不能加X锁,直到T1释放了A的S锁”。也就隐含这个事务的本身可以在对A加S锁后,可再对它加X锁。而排它锁就不行,包括事务本身。2.要明白封锁与两段锁协议以及其它协议的区别,只要满足S、X锁的要求,那么封锁就可行,不要去管之后出现的数据不一致性问题。而两段锁协议以及其它协议就是来解决就些问题的。
我们再从头来看这个问题:(第一个)T1对数据对象A加上S锁,其他事务没有对A加上S锁,T1可以不用对A进行解锁直接再加上X锁。这不就符合S锁的隐含意思吗!!!
(第二个)你所提出的事务T2在T1对A加上S锁之后,T1对A加上X锁之前,对A加上了S锁,则TI必须对自己加在A上的s锁进行解锁后才能继续加上X锁,我分析很久发现这与你讲的书上原话不一样。这样会出现另一个错误。这里你要仔细考虑!!!。“你想前提T1对A加S锁,后对T2来讲它又对A加了S锁,T1又来对A加X锁,两个事务了不是一个事务本身,这不就不符合S锁要求了。所以解T1上的S锁就消除其它事务在已加S锁后又来加X锁这个错误。我把这外错误称错误1,你的问题之后 又来句“TI对自己加在A上的s锁进行解锁后又加上X锁”这又再次不符合S锁要求产生错误2.也就是你的问题是在S锁要求上解决错误1,但之后又有错误2.
对于书上的表述是没有错误的。“ 当两个事物对A都进行了加S锁的时候,则TI就必须先解S锁了”这里你可以这样想,下一步如果T1对A加X锁,那么首先我们遇到的是错误1,我们要如何解决错误1,就只有解T1 S锁。而只后要面对的错误2这里就不要考虑了,因为这句话没有再往下讲。所以它的表述是对的,而你把下面的问题也提出来了显然只解决错误1是不行的,它会引来错误2.
我花了近三四十钟写这个,你可以好好揣摩。或者加我Q1552287518把你的想法说下,我也很想知道正确理解,不知自己的是否只是自己在瞎想。过两天我也要考数据库了 呵呵……