EntiryFramework中事务操作(二)TransactionScope

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


更多:

EntiryFramework中事务操作(一)

EntiryFramework中事务操作(三)事务回滚数据模型和数据库不对应问题

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值