gpt4 book ai didi

c# - 在 Web 应用程序中使用 TransactionScope 安全吗?

转载 作者:太空宇宙 更新时间:2023-11-03 16:02:43 30 4
gpt4 key购买 nike

在 Web 应用程序中使用 TransactionScope 时,我遇到了一个随机的大问题:

我有一个 Web 应用程序,它有一些使用事务的方法:

public class ProductsService
{
private readonly ProjectDbContext _db;
public ProductsService(ProjectDbContext db)
{
_db = db;
}

public void DelteProduct(Guid product_Id)
{
Product product = _db.Products.First(p => p.Id == product_Id);

using (TransactionScope ts = new TransactionScope())
{
// Delete comments
_db.SaveChanges();

// Delete subscriptions
_db.SaveChanges();

// Delete product
_db.SaveChanges();

ts.Complete();
}
}
}

在本地测试,我没有遇到任何问题。

但是,当我将项目投入生产时,我随机得到 SqlExceptionTransaction 错误:

System.Data.SqlClient.SqlExceptionTransaction (Process ID 55) was deadlocked on lock resources with another process and has been chosen as the deadlock victim.
Rerun the transaction.

我认为事务应该在队列中工作,新事务应该等到旧事务提交,而不是阻塞它们——即使发生错误也是如此。

  1. 为什么会出现此错误?
  2. 我应该完全避免在 Web 应用程序中使用事务吗?
  3. 我使用的 TransactionScope 错了吗?

最佳答案

I thought transactions should work in a queue, and new Transactions should wait until older ones are committed, and not blocking them - even if an error occurs.

交易排队,但前提是可能。当两个事务相互等待时,就会发生死锁;双方都持有对方所需的资源。有大量文章描述了死锁以及它们如何在数据库中发生。

Why i am getting this error?

如果您想查看导致死锁的原因,您可以分析您的数据库并分析死锁图 (https://www.simple-talk.com/sql/learn-sql-server/how-to-track-down-deadlocks-using-sql-server-2005-profiler/)。作为一般说明,我会避免使用 TransactionScope 默认构造函数,因为它将事务级别设置为序列化 (http://blogs.msdn.com/b/dbrowne/archive/2010/05/21/using-new-transactionscope-considered-harmful.aspx)。

来自文章:

In SQL Server SERIALIZABLE transactions are rarely useful and extremely deadlock-prone. Put another way, when the default READ COMMITTED isolation level does not provide the right isolation semantics, SERIALIZABLE is rarely any better and often introduces severe blocking and deadlocking problems".


Should i avoid using Transactions at all in web applications?"

无论如何,不​​。事务应该用于定义原子操作,必须提交的事情应该在一个事务中运行。回想起来,Web 应用程序并没有什么特别之处,但是:停止使用默认构造函数。

I am using TransactionScope wrong?"

正如我上面所解释的:是的,避免使用默认构造函数并具体说明您的事务级别; “连载”永远不是正确答案

关于c# - 在 Web 应用程序中使用 TransactionScope 安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20605688/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com