数据库锁机制

1.共享锁:数据库在执行查询操作时会向table添加共享锁,不同的共享锁之间是兼容的,这意味着共享锁不阻止其它session同时读资源。

2.互斥锁:数据库在执行update操作前会试图向当前表添加互斥锁,而根据数据库的规定,同一资源上不可以同时存在共享锁和互斥锁,所以,update操作需要等到施加共享锁的操作结束后才能执行。共享锁不阻止其它session同时读资源,但阻止其它session update。

例:————————————————————

T1:    select * from table

T2:    select * from table

T3:    update table set column1='hello'

——————————————————————

T1和T2可以同时运行,而T3需要等到T1和T2都运行完才能运行。

3.死锁的发生:

例:————————————————————

T1:

begin tran

select * from table (holdlock) (holdlock意思是加共享锁,直到事物结束才释放)

update table set column1='hello'

T2:

begin tran

select * from table(holdlock)

update table set column1='world'

——————————————————————————

假设T1和T2同时达到select,T1对table加共享锁,T2也对加共享锁,当

T1的select执行完,准备执行update时,根据锁机制,T1的共享锁需要升

级到排他锁才能执行接下来的update.在升级排他锁前,必须等table上的

其它共享锁释放,但因为holdlock这样的共享锁只有等事务结束后才释放,

所以因为T2的共享锁不释放而导致T1等(等T2释放共享锁,自己好升级成排

他锁),同理,也因为T1的共享锁不释放而导致T2等。死锁产生了。

4.预防死锁发生:

1) 将共享锁换成互斥锁

2) 将共享锁换成更新锁(效率高)

你可能感兴趣的:(数据库锁机制)