首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只读行可以触发数据库死锁吗?

只读行可以触发数据库死锁吗?
EN

Stack Overflow用户
提问于 2014-09-04 22:44:49
回答 1查看 1.6K关注 0票数 1

跟进https://stackoverflow.com/a/16553083/14731..。

我理解,为了减少死锁的频率,维护表的组成锁定顺序是很重要的,这影响到UPDATESELECT语句1。但是,对只读行是否同样有效?

如果一个行在初始化时被填充了一次,而没有人再次修改它,那么我们访问它的顺序有什么关系吗?

给定两个事务: T1、T2和两个只读行( R1、R2 )

T1读取R1,R2 T2读取R2,然后R1

即使我使用SERIALIZABLE事务隔离,事务死锁也可以吗?

1如果事务隔离为REPEATABLE_READ、T1 SELECTs R1、R2,而T2 UPDATE的R2、R1则可能出现死锁。

CLARIFICATION:这个问题不是关系数据库管理系统特有的.我的印象是,没有任何实现可以在只读行上死锁.如果你有一个反例(对于一个具体的供应商),请张贴一个答案演示,我会接受它。或者,发布一个可以证明不会死锁的所有具体实现的列表(最完整的列表将被接受)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-05 21:54:51

这个问题是不可能回答所有可能的RDBMS的,因为锁定策略是一个实现细节。尽管如此,有用的RDBMS将有一些共同的特性:

对于没有应用提示的SELECT语句(FOR UPDATEWITH (UPDLOCK),.)任何合理的RDBMS都不会使用写锁。可能需要读锁。实际上,除了Hekaton表之外,至少Server对SERIALIZABLE也这样做。

读锁从不冲突。如果只执行读取,则不可能出现死锁。

但是,只读行可能导致死锁,即使它们从未写入Server中的.

代码语言:javascript
复制
UPDATE T SET SomeCol = 1 WHERE ID = 10 AND SomeCol = 0

如果SomeCol不是0,则立即释放锁,不会写入任何东西。但是U锁是一种可能发生冲突并导致死锁的锁类型。如果ID为10的行没有出现,则不可能出现死锁。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25676116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档