排它锁又叫写锁,事务A对数据D加了排它锁,其它任何事务都不能再对数据D加共享锁或者排它锁。也就是说A可以读取或者修改D,但是其它事务不能读也不能写,但是!!即使数据D加了写锁,其它事务的最基本的select语句还是可以读数据D的,因为最基本的select语句并不用申请任何锁!这个是最迷惑的地方,明白了这一点,一级封锁协议协议会读脏数据就很好理解了。事务A对数据D=1加了排它锁,修改了数据使D=2,这个时候事务B虽然不能对数据D加任何锁,但是可以用select语句读,B读到了数据D=2,之后事务A出错,回滚D=1,那你B就读到了脏数据。二级封锁协议规定在一级的基础上规定,事务A对数据D加了排它锁,事务B想用基本的select语句读D也必须要申请共享锁(读锁)!!,而一级是不需要的!!,所以B在事务A没结束期间都不能读数据D,这样就不会出现读脏数据了!但是二级却不能保证可重复读,这是因为,二级规定读锁是读完就释放!!而不是事务结束才释放。比如B先对数据D=1加了读锁,读完释放了读锁,但是事务B并没有结束,这时事务A对数据D加了写锁,然后修改D=2,释放了写锁,这时,事务B再次对数据D申请读锁,读到了D=2,同一个事务,两次读取不一致,这就是二级为何不能保证可重复读!三级就是不是读完就释放,而是事务结束才释放,这样就可保证可重复读了。
数据库封锁协议解释:重点
最新推荐文章于 2022-04-08 11:23:41 发布