【发布时间】:2016-04-15 07:51:21
【问题描述】:
我有一个使用实体框架的小程序。我以下列方式使用它们。
- 在数据库中创建过程。
- 在实体框架中进行交易。
- 调用该事务中的过程。
这再简单不过了。但是,我怀疑是否可能出现死锁?我的代码如下。
void AddA()
{
using (var db = new Entities())
{
using (var tran = db.Database.BeginTransaction())
{
db.Add_A("helloA");
Thread.Sleep(5000);
db.Add_B("helloB");
tran.Commit();
}
}
}
void AddB()
{
using (var db = new Entities())
{
using (var tran = db.Database.BeginTransaction())
{
db.Add_B("helloB");
Thread.Sleep(5000);
db.Add_A("helloA");
tran.Commit();
}
}
}
Add_A 和 Add_B 是这里的过程。
在我看来,这两个方法同时调用会导致死锁,因为它们占用表的顺序不同。
但是,当我做一些测试时,死锁并没有发生。这里有什么问题?是我做错了什么还是没有死锁的风险?
欢迎任何反馈。提前致谢。
PS:我使用的是 SQL Server 2014 和 Entity Framework 6.0。
【问题讨论】:
-
怎么称呼AddA和AddB?因为如果它只是顺序的,你永远不会冲突
-
你为什么要使用事务?
SaveChanges已经使用了一个事务。如果您在每个Add方法中保存,那么您做错了。您应该将所需的所有实体添加到上下文中,然后调用 SaveChanges 一次 -
@AllanS.Hansen 嗯,我同时调用了 AddA 和 AddB,据我所知,可能有问题,因为 AddA 先占表 A,而 AddB 先占表 B,他们很想占另一张桌子已经被对方占用了。
-
@AllanS.Hansen 嗯,我同时调用了 AddA 和 AddB,据我所知,可能有问题,因为 AddA 先占表 A,而 AddB 先占表 B,他们很想占另一张桌子已经被对方占用了。
-
@PanagiotisKanavos 感谢您的帮助。但是为什么我在这里使用程序是程序中有一些逻辑。所以,毕竟我想要实现的是创建一个包含多个过程并且不会发生任何死锁的事务。我对数据库的东西有点傻,所以我知道这不是一个好方法。你有更好的方法吗?
标签: sql-server entity-framework deadlock sql-server-2014