谈谈数据库系统概论中对排他锁,一级封锁协议的理解
在王珊这本书,排他锁的定义如下:
- 若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁为止。这就保证了其它事务在T释放A上的锁之前不能再读取和修改A。
- 一级封锁协议不是规定事务在修改数据之前要加X锁吗,那加了X锁,其它事务在T释放A上的锁之前不是不能再读取和修改A吗,那么为什么一级封锁协议无法解决读“脏”数据的问题呢?
- 排他锁的定义就令我很疑惑,后来经过我自己的思考,觉得理解如下(不知道是否正确,如有错误,欢迎指正)
自己的理解如下:
- 注意“其它任何事务都不能再对A加任何类型的锁”和“其它事务在T释放A上的锁之前不能再读取和修改A”这两句话
- 我觉得其它任何事务都不能再对A加任何类型的锁才是X锁的真正含义,至于其它事务还能不能修改和读取A还要结合封锁协议的规定才能得出最后的结论
- 一级封锁协议的规定:事务T想对数据对象A进行修改操作,那么要给A上X锁。结合一级封锁协议和其它任何事务都不能再对A加任何类型的锁这个X锁的定义,我们就能得出其它事务如果想对A进行修改操作,那么要给A上X锁,但是事务T已经对A上了X锁,那么自然其它事务就无法对A上X锁,无法对A上X锁,就意味着无法对A进行修改。所以一级封锁协议解决了丢失修改问题
- 那么其它事务只想对A进行读操作呢?注意哦!一级封锁协议没有规定对A进行读操作要上锁。那么其它事务就无需对A上锁,既然不用上锁,那么自然就没有违反其它任何事务都不能再对A加任何类型的锁这个规定,即是没有违反X锁的规定,所以其它事务能读取数据对象A,所以一级封锁协议自然就无法解决读“脏”数据。
- 再看看二级封锁协议,也就明白二级协议为什么能解决读“脏”数据了
就这些了,也不知道我的理解对不对,反正我看到书上对排他锁的定义我就一脸懵逼。如果你们还有其它更好的解释,欢迎你们指点指点我。