本文共 1552 字,大约阅读时间需要 5 分钟。
一、说明
在EF中如果使用多个上线文访问数据库,那么事务通常使用TransactionScope。
在多线程使用TransactionScope的时候会抛出异常:
分布式事务已完成。请将此会话登记到新事务或 NULL 事务中。
解决方案:
方案一,使用线程锁,确保事务执行代码,同一时间仅有一个线程执行
方案二、封装处理TransactionScope,同一个事务实例,只能被同一个线程使用,其他的使用者等待,代码如下:
////// 自定义事务处理,/// 此版本,数据库上下文会出现多个,所以事务使用 TransactionScope /// 使用排它锁,确保事务的单线程执行/// public class EFTransaction : IDisposable{ private readonly static object _MyLock = new object(); ////// 当前事务对象 /// private TransactionScope tran = null; public EFTransaction() { Monitor.Enter(_MyLock);//获取排它锁 this.tran = new TransactionScope(); } ////// 提交 /// public void Commit() { tran.Complete(); } ////// 混滚操作,在Dispose(),中自动调用回滚 /// public void Rollback() { //提前执行释放,回滚 if (tran != null) tran.Dispose(); } public void Dispose() { if (tran != null) tran.Dispose(); Monitor.Exit(_MyLock);//释放排它锁 }}
使用示例:
using (var tran = new EFTransaction()) { //修改名称 name = ">>ModuleOperate:" + name; UpdateFirstName(name); //2.修改菜单 MenuOperate _menu = new MenuOperate(); _menu.UpdateFirstName(name); //提交事务 tran.Commit(); }
关于本异常,更多参考:
参考一:
更多相关文章:
转载地址:http://dnogi.baihongyu.com/