一、在使用EF的TransactionScope事务时,如果多线程程序,经常会抛出如下异常
{"事务(进程 ID 58)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。"}
同一个TransactionScope逻辑操作事务在多线程中启动时会抛出异常。
解决方案:
使用线程锁,对同一个事务操作,仅允许一个线程执行
示例说明
1.出现异常的代码
事务操作定义
-
using (var tran = new TransactionScope())
-
-
ModuleOperate _module = new ModuleOperate();
-
-
_module.UpdateFirstName("模块:" + name);
-
-
this.UpdateFirstName("菜单:" + name);
-
-
-
多线程调用定义
-
Action<object> update1 = (number) =>
-
-
-
-
-
MenuOperate _menu = new MenuOperate();
-
_menu.UpdateName(Count.ToString());
-
-
Console.WriteLine("-------");
-
Console.WriteLine(_menu.GetName2());
-
-
-
Thread.Sleep(1000 * Convert.ToInt32(number));
-
-
-
for (int i = 0; i < 3; i++)
-
-
Task.Factory.StartNew(update1, i + 1);
-
2.解决方案代码一:使用lock锁定
-
-
private readonly static object _MyLock = new object();
-
-
-
-
-
-
public bool UpdateName(string name)
-
-
-
-
using (var tran = new TransactionScope())
-
-
ModuleOperate _module = new ModuleOperate();
-
-
_module.UpdateFirstName("模块:" + name);
-
-
this.UpdateFirstName("菜单:" + name);
-
-
-
-
-
-
3.解决方案代码二:使用Monitor封装TransactionScope
使用代码:
-
using (var tran = new EFTransaction())
-
-
-
name = ">>ModuleOperate:" + name;
-
-
-
-
MenuOperate _menu = new MenuOperate();
-
_menu.UpdateFirstName(name);
-
-
-
-
EFTransaction类定义:
-
-
-
-
-
-
public class EFTransaction : IDisposable
-
-
private readonly static object _MyLock = new object();
-
-
-
-
private TransactionScope tran = null;
-
-
-
-
this.tran = new TransactionScope();
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
使用验证代码:不同线程对于同一个事务操作多个事务实例,在当前程序中事务操作代码顺序同步执行,不会出现异常和数据异常。
-
Action<object> update1 = (number) =>
-
-
-
-
-
MenuOperate _menu = new MenuOperate();
-
ModuleOperate _module = new ModuleOperate();
-
-
-
_menu.UpdateName(Count.ToString());
-
-
-
_module.UpdateName(Count.ToString());
-
Console.WriteLine("-------");
-
Console.WriteLine(_menu.GetName2());
-
-
-
Thread.Sleep(1000 * Convert.ToInt32(number));
-
-
-
for (int i = 0; i < 3; i++)
-
-
Task.Factory.StartNew(update1, i + 1);
-
原文引自:https://blog.csdn.net/u011127019/article/details/54576873
EF 多线程TransactionScope事务异常"事务(进程 ID 58)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。
原文:https://www.cnblogs.com/lxf1117/p/14238810.html