【发布时间】:2013-12-16 07:42:30
【问题描述】:
在 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.
我认为事务应该在队列中工作,新事务应该等到旧事务被提交,而不是阻塞它们——即使发生错误。
- 为什么会出现此错误?
- 我应该避免在 Web 应用程序中使用事务吗?
- 我用
TransactionScope错了吗?
【问题讨论】:
-
这里为什么需要
TransactionScope? -
这是一个简单的例子。我需要确保所有相关条目都已成功删除并且数据库中没有孤立数据
-
如果
ProjectDbContext是EF 上下文,那么SaveChanges本身就是事务性的。您不应该以这种方式使用范围。 -
我知道这一点,但在删除时我需要按顺序提交更改以避免数据库
Reference Keys异常。这个例子比较简单,通常我也会删除其他条目。 -
> 我需要按顺序提交更改-您应该发布有关此的更多详细信息。我无法想象 EF 的情况,当一个人应该匹配删除序列以从存储中删除条目时。
标签: c# asp.net transactions transactionscope