TransactionScope 和存储过程中的死锁

发布于 2024-11-18 16:08:53 字数 377 浏览 1 评论 0原文

我有一个 sproc ,基本上是这样的:

begin transaction
    SELECT
    UPDATE
    INSERT
commit transaction

这个 sproc 在我的应用程序中的两个不同线程的循环内调用,两个线程都在 TransactionScope 内使用默认选项。

有时,我的应用程序会陷入僵局:

“事务(进程 ID 184)在锁资源上与另一个进程发生死锁,并已被选为死锁牺牲品。重新运行该事务。”

我能做些什么吗?我应该使用不同的隔离级别吗?

I've got a sproc that basically goes:

begin transaction
    SELECT
    UPDATE
    INSERT
commit transaction

This sproc is called inside a loop from two different threads in my application, both within a TransactionScope with default options.

Occasionally, my application deadlocks:

"Transaction (Process ID 184) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction."

Is there anything I can do about this? Should I use a different isolation level?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

清风不识月 2024-11-25 16:08:53

TransactionScope 使用的默认隔离级别是 Serialized,这通常是不必要的。使用构造函数,它接受TransactionOptions 指定其他级别。

基于 David Baxter Browne(一篇描述这个问题的精彩博客文章)。

TransactionOptions tOptions= new TransactionOptions();
tOptions.IsolationLevel = IsolationLevel.ReadCommitted;
using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.Required, tOptions))
{
  // do stuff here
}

Default isolation level used by TransactionScope is Serializable which usually is unnecessary. Use a constructor which takes TransactionOptions to specify other level.

Example based on blog post from David Baxter Browne (a great blog post describing this problem).

TransactionOptions tOptions= new TransactionOptions();
tOptions.IsolationLevel = IsolationLevel.ReadCommitted;
using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.Required, tOptions))
{
  // do stuff here
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文