sql - 选择查询的事务死锁

标签 sql tsql concurrency deadlock

有时,对于仅作为Select查询的存储过程,会出现以下错误:Transaction (Process ID 91) was deadlocked on lock
我最初的理解是,选择查询不会锁定表,也不会导致死锁,即使它试图查询的表正在被另一个进程更新/锁定,但似乎选择查询会导致死锁,因为好。

如果我将隔离级别设置为查询未提交,那可以解决问题吗?

最佳答案

My init understanding is that a Select query won't lock a table, or won't cause a deadlock



这种理解是错误的。 SELECT查询在其分析的行上使用共享锁。共享锁可能与来自更新/删除/插入语句的排他锁冲突。两个SELECT语句不会死锁,但是SELECT可以通过UPDATE死锁。当发生这种死锁时,SELECT通常是牺牲品,因为它没有执行任何更新,因此总是会丢失抽签。

与任何死锁一样,您需要发布所涉及表的确切架构,确切的T-SQL语句和死锁图。参见How to: Save Deadlock Graphs (SQL Server Profiler)。通过此信息,您可以获取有关如何修复死锁的指导。

关于sql - 选择查询的事务死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5826600/

相关文章:

SQL XML 嵌套元素

mysql - 在可在不同数据库服务器上运行的查询中使用保留字

php - 如何使用 PHP 将今天的日期保存到数据库中?

sql - 当列的顺序不同时创建 UNION ALL 查询

sql-server - 为每一行获取随机数

sql-server-2008 - Cursor 使用中的 T-Sql 错误

java - 对来自异步线程的信号使用静态 boolean 值与 AtomicBoolean 之间的区别

sql - IS NULL 和 IS NOT DISTINCT FROM NULL 之间有区别吗?

java - 如果通过大量线程快速添加/删除 LinkedList,对象会丢失吗?

java - 请确认此 XMPP 代码不是线程安全的