|
|
1
9
SELECT不能与其他SELECT死锁,因为它们只获取共享锁。你说我们应该考虑这些选择现在'需要独占读锁',但这是我们不可能考虑的,因为1)没有一个
但你确实提出了一个更一般的问题,简单的语句是否会死锁。答案是明确的,响亮的 对 . 锁是在执行时获取的,而不是预先分析和排序,然后按某种顺序获取。引擎不可能预先知道所需的锁,因为它们取决于磁盘上的实际数据,而要读取引擎需要的数据。。。锁定数据。 由于索引访问顺序不同,简单语句(SELECt vs.UPDATE或SELECt vs.DELETE)之间的死锁非常常见,并且非常容易调查、诊断和修复。但请注意 总是 所涉及的一种写操作,因为读操作不能相互阻塞。对于本讨论,向SELECT添加UPDLOCK或XLOCK提示应视为写入。您甚至不需要连接,辅助索引很可能会引入导致死锁的访问顺序问题,请参阅 Read/Write Deadlock .
最后,写作
更新
这个 最容易处理错误,简单的重新读取状态,应用逻辑,重新写入新状态。话虽如此,但有一些好的做法可以大大减少死锁的发生频率,直至死锁几乎消失殆尽:
|
|
|
2
0
|
|
|
3
0
读取不会使彼此死锁。你一定也在写东西。 您可以采取措施减少死锁的数量。例如,在支持行锁定并避免更新记录的平台上,只在聚集索引的末尾插入。啊哈,现在Facebook的UI更有意义了。 有时处理死锁比避免它们容易。服务器将失败并报告,您可以重试。 |