|
|
1
1
你必须承认,这似乎是一件非常不寻常的事情。我想知道是否最好先更新单独的表,然后在末尾有一个将单个表连接到最后一个表的update语句?(即
但是,如果您希望继续沿着此路径运行,那么只需在每个存储过程中设置未提交的读取。这是最好的选择。 |
|
|
2
1
死锁可能不仅仅是由另一个SP锁定行引起的。在这种情况下,第一个过程只需等待锁定SP释放锁定。这并不是说你的多重程序没有引起问题。不过还有很多。 为了避免这个问题,您可能需要做一些修改,但是首先您应该了解更多关于死锁情况的信息。我怀疑您锁定了正在更新的行以外的对象。 有很多方法可以收集关于死锁的更多信息。这里有一个 link 在这里您可以了解死锁的详细信息。 |
|
|
3
0
简单:做诉讼,你不留任何地方的锁。这与由连接确定的事务隔离一起工作。由于属性事务是易失的,因此不会有锁,因此不会出现死锁。 更新不是问题所在。它从阅读开始。转到“未斜接读取”以确保在读取时不保留锁,和/或使用select语句中的nolock选项单独强制它们在读取数据时不保留锁(更可取)。 然后,如果确保SP在插入之后(内部或外部)立即提交,则不可能出现死锁-写锁将导致下一个SP等待提交第一个事务。 尤其是当只访问一个表/一行时,死锁不可能只使用update语句IIRC。是读锁把延迟锁(尽管延迟很小)变成了死锁。 http://www.eggheadcafe.com/software/aspnet/30976898/how-does-update-lock-prevent-deadlocks.aspx 有一些死锁的好例子。因此,如果除了更新之外的所有内容都没有锁,那么最后就不可能出现死锁。 |
|
|
4
-1
行级锁定是尽可能低的,所以我认为您必须将更新的表分解成几个表,您可以独立地更新它们。 |
|
|
5
-1
不,两个会话不能同时更新同一行。行级锁定是尽可能低的,因此当一个会话更新一行时,其他希望更新该记录的会话将等待。 至于死锁,SQL Server的问题在于,默认情况下,如果select语句请求当前正在更新的记录,它将阻塞。如果不介意读取未提交的数据,可以使用with(nolock)。 所以,如果你有这样的事件顺序: 休会
诀窍是只在必要的最短时间内锁定某个对象(不要为了释放锁而分解一系列语句-确保构成逻辑事务的步骤保持为事务):
或(警告清空器)使用nolock指令:
|
|
|
Jess The Witch · GCP云功能中处理延迟任务的模式 1 年前 |
|
Plup · 连接失败时,PyMongo异步客户端未引发异常 1 年前 |
|
|
user1233894 · 尝试从全局函数传递值 1 年前 |
|
|
Fabiano Taioli · 管理单线程Rust中的阻塞函数 1 年前 |
|
|
river7816 · 为什么spdlog不在async函数中打印 1 年前 |