博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EntiryFramework中事务操作(二)TransactionScope
阅读量:4287 次
发布时间:2019-05-27

本文共 2009 字,大约阅读时间需要 6 分钟。

一、EntityFramework事务操作之TransactionScope

TransactionScope

位于using System.Transactions;命名空间下,需要在引用中手动加入。该类不能被继承。

//    // 摘要:    //     使代码块成为事务性代码。此类不能被继承。    public sealed class TransactionScope : IDisposable

常用参数

1.TransactionScopeOption

//// 摘要://     该范围需要一个事务。如果已经存在环境事务,则使用该环境事务。否则,在进入范围之前创建新的事务。这是默认值。Required = 0,//// 摘要://     总是为该范围创建新事务。RequiresNew = 1,//// 摘要://     环境事务上下文在创建范围时被取消。范围中的所有操作都在无环境事务上下文的情况下完成。Suppress = 2

2.TimeSpan设置超时时间

//        // 摘要:        //     以指定的超时时间值和要求初始化 System.Transactions.TransactionScope 类的新实例。        //        // 参数:        //   scopeOption:        //     System.Transactions.TransactionScopeOption 枚举的一个实例,描述与此事务范围关联的事务要求。        //        //   scopeTimeout:        //     在 System.TimeSpan 之后,事务范围将超时并中止此事务。        public TransactionScope(TransactionScopeOption scopeOption, TimeSpan scopeTimeout);

优点:

1、使用起来比较方便.TransactionScope可以实现隐式的事务,使你可以在写数据访问层代码的时候不用考虑到事务,而在业务层的控制事务.

2、可以实现分布式事务,比如跨库或MSMQ.

3.在EntityFramework中可以解决DbContextTransaction的多个上下文出现死锁问题。也就是说在EF中使用TransactionScope事务时,不用考虑数据库操作的多上下文问题。

缺点:

1.此中方式对于数据库锁定表,会影响其他进程的查询,也就是对于锁定的表,查询也锁定,不允许出现脏读,其他的查询需要挂起等待。重点是不能进行配置修改。

2.此中方式对于同一个范围/同一个逻辑操作,需要进行多线程的锁定处理,不然多个线程开启同一个事务会抛出异常。

3.多个事务操作中,存在锁定同一个表的时候也会出现死锁现象

使用实例如下:

Test1 _context = new Test1();Test1 _context2 = new Test1();using (TransactionScope tran = new TransactionScope()){    try    {        //1.修改省        Area province = _context.Areas.FirstOrDefault(q => q.AreaLevel == 1);        province.AreaName = province.AreaName + "1";        _context.SaveChanges();        Console.WriteLine(_context2.Areas.FirstOrDefault(q => q.AreaLevel == 1).AreaName);        //2.修改市        Area city = _context2.Areas.FirstOrDefault(q => q.AreaLevel == 2);        city.AreaName = city.AreaName + "1";        _context2.SaveChanges();        //抛出异常        throw new Exception("测试事务异常");        tran.Complete();    }    catch (Exception ex)    {        Console.WriteLine("执行出错:" + ex.Message);    }}

特别说明:

1.如果你的上下文在程序中只有一个,那么如果执行事务期间出现异常,也会出现数据模型和数据库中数据不对应情况。

更多:

转载地址:http://vjogi.baihongyu.com/

你可能感兴趣的文章
android中常见的设计模式有哪些?
查看>>
ViewDragHelper_v4的滑动视图帮助类_解释和代码
查看>>
android性能优化
查看>>
WebService应用之客户端 Ksoap 库调用
查看>>
WebService - SOAP协议
查看>>
即时通讯技术- 推送技术协议方案
查看>>
融云 rongyun
查看>>
XMPP - 实现即时通讯相关库
查看>>
即时通讯协议 MQTT
查看>>
OpenCore框架
查看>>
vitamio简介.java
查看>>
VLC-流媒体开源库
查看>>
android 流媒体开源库
查看>>
android-各种动画加速器,各种插值器
查看>>
ActiveMQ 推送服务
查看>>
ActiveMQ API 详解
查看>>
ActiveMQ 实现负载均衡+高可用部署方案
查看>>
包管理工具(语言或者系统)
查看>>
几行代码看懂android View的事件传递机制(视图逻辑)
查看>>
android Handler的核心原理,核心代码关键词
查看>>