数据库死锁问题

本文详细介绍了数据库中的锁机制,包括共享锁(S)、更新锁(U)和排它锁(X)等不同类型锁之间的兼容性,以及可能产生的死锁场景。此外还讨论了乐观锁的概念及其在并发更新中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库死锁:

锁分类:
S 共享锁
U 更新锁
X 排它锁

锁兼容性:
锁 S U X
S Y Y N
U Y N N
X N N N

死锁场景:

单表:
场景1: T1, T2 X锁都加不上.
T1 T2
S S
X X

场景2: T1 X锁加不上, T2 U锁加不上.
T1 T2
U S
X U

多表(A,B):
场景3: T1, T2 X锁都加不上.
T1 T2
S(A) S(B)
X(B) X(A)

场景4: T1, T2 S锁都加不上.
T1 T2
X(A) X(B)
S(B) S(A)

场景5: T1, T2 U锁都加不上.
T1 T2
U(A) U(B)
U(B) U(A)

场景6: T1 S锁加不上,T2 U锁加不上.
T1 T2
U(A) X(B)
S(B) U(A)


场景7: T1 S锁加不上,T2 X锁加不上.
T1 T2
S(A) X(B)
S(B) X(A)

场景8: T1 U锁加不上,T2 X锁加不上.
T1 T2
S(A) U(B)
U(B) X(A)

..............
乐观锁:
..............
[url]http://ajava.org/course/open/5391.html[/url]

乐观锁是解决并发更新丢失问题,较悲观锁而言性能更好.

关于乐观锁如何进行版本控制, Hibernate 应该是更新时同步了缓存的, 因此在提交之前,做个切点判断实体的版本号是否大于当前数据库的版本号, 就可以抛出异常了. 没看源码,瞎猜的.

在看了代码后,发现是执行更新后,根据返回影响的行数来决定是否抛出异常的,与缓存没关系.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值