发布网友 发布时间:2022-04-27 04:19
共1个回答
热心网友 时间:2022-04-09 11:15
这是个同一事务对同一数据对角加锁、解锁问题。
第一个问题完全可以,解释有点麻烦,你可以在你要考试的那本书中的两段锁协议那节看到这样的例子。
第二个问题符合封锁两种类型的要求,可以这样加锁。但是会带来数据不一致性的问题,看你加锁对数据的操作了。数据不一致性的问题举个例子:T2加S 锁后读A数据为100,但之后T1事务在X后修改A=200,T2再次读时A就为200。出现不可重复读的问题。其实对于第二个问题不管是解S锁还是不解都会出现不可重复读问题,你也可不考虑。所以就没有TI必须对自己加在A上的s锁进行解锁后才能继续加上X锁这说。没有必要!!!追问非常谢谢!但是我的第二个问题是,两个不同T1,T2的事物对同一个事物A加了S锁,那T1想对S进行加X锁必须先解掉自己加在A上的S锁吗? 我把我的问题打在问题补充里了,请你耐心看下哈。
还有你的回答“T2加S 锁后读A数据为100,但之后T1事务在X后修改A=200,T2再次读时A就为200。”前提是不是T1先对T2加了S锁?不是的话T1是不能对A加X锁进行修改的吧,他必须等待T2对A进行了解锁后才行吧。不过我想了下的确是会出现不可重复读的问题
追答搞得有点乱,我看了有十几分钟感觉前后你的问题不一样了,没想错的话前面应该第二问出现错误。我们先理清两个问题: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把你的想法说下,我也很想知道正确理解,不知自己的是否只是自己在瞎想。过两天我也要考数据库了 呵呵……