排它锁:
什么是排它锁:其他事务对该资源既不能读也不能改,排它锁独占资源
example 1: (假设id是连续增长的)
req1:update tabletast set .... where id >10
req2:update tabletast set .... where id <10
若req1先到达,给表id大于10的数据加上排他锁,这时req2到达要给id小于10 的数据加上排它锁,虽然req1并没有释放资源,但是两者锁的资源不冲突,所以req2不会被阻塞。
example 2: (假设id是连续增长的)
req1:update tabletast set .... where id >20
req2:update tabletast set .... where id <10
若req1先到达,给表id大于20的数据加上排他锁,这时req2到达要给id小于10 的数据加上排它锁,这时req2会被阻塞,只能等req1释放排它锁,req2才能加上排它锁。说明同一资源只能有一个排它锁。
example 3: (假设id是连续增长的)
req1:
开启事务
select * from tabletest
update tabletest set ....
req2:
开启事务
select * from tabletest
update tabletest set ....
若req1和req2同时到达 第一句,都给该表加上共享锁,该表已存在两个共享锁,这时不会出现阻塞状况。当req1和req2都开始执行第二句时,都想升级为排他锁,这时事务没结束,req1和req2的共享锁还没释放,req1想升级为排它锁,等待req2共享锁的释放,req2也想升级为排它锁,等待req1共享锁的释放,形成了死锁!