public class EFTransaction:ITransaction
{
DbContextTransaction originalTransaction = null; MyDbContext myDbContext = null; /// <summary>
/// 默认构造函数
/// </summary>
public EFTransaction()
{
myDbContext= DbContextHelper.MainDbContextFactory.GetDbContext(AccessMode.Write);
originalTransaction = myDbContext.Database.CurrentTransaction;
} /// <summary>
/// 构造函数
/// </summary>
public EFTransaction(IDbContextFactory factory)
{
myDbContext= factory.GetDbContext(AccessMode.Write);
originalTransaction = myDbContext.Database.CurrentTransaction;
} /// <summary>
/// 开始事务
/// </summary>
public void BeginTransaction()
{
MyDbContext dbContext = myDbContext;
if (originalTransaction == null)
{
dbContext.Database.BeginTransaction();
}
ThreadTransaction.SetTransactionFlag(true); } /// <summary>
/// 提交一个事务
/// </summary>
/// <returns></returns>
public int Commit()
{
int result = ;
if (originalTransaction == null)
{
result += myDbContext.SaveChanges();
ThreadTransaction.SetTransactionFlag(false);
DbContextTransaction transaction = myDbContext.Database.CurrentTransaction;
if (transaction != null)
{
transaction.Commit();
transaction.Dispose();
result += ;
} }
return result;
} /// <summary>
/// 回滚一个事务
/// </summary>
public void Rollback()
{ if (originalTransaction == null)
{
ThreadTransaction.SetTransactionFlag(false);
DbContextTransaction transaction = myDbContext.Database.CurrentTransaction;
if (transaction != null)
{
transaction.Rollback();
transaction.Dispose();
}
}
else
{
throw new Exception("嵌套内部事务异常");
}
} }

支持嵌套事务

使用示例:

  public static TResult AddTest0()
{ BookDAL testdal = DALFactory.CreateDAL<BookDAL>();
Framework.DataAccess.EFTransaction Transaction = new Framework.DataAccess.EFTransaction();
Transaction.BeginTransaction();
try
{
testdal.Insert(new Book { NAME="c#1234" });
Transaction.Commit();
}
catch (Exception ex)
{
Transaction.Rollback();
}
var ss= testdal.GetList();
return null;
}

EF事务封装的更多相关文章

  1. EF 事务

    http://yanwushu.byethost7.com/?p=87 1. EF对事务进行了封装:context的saveChange()是有事务性的. 2. 依赖多个不同的Context的操作(即 ...

  2. EF事务处理封装公用

    /// <summary> /// EF事务封装 公用类 /// </summary> public class TransactionCommon { DbContextTr ...

  3. 分享我们项目中基于EF事务机制的架构

    写在前面: 1. 本文中单元测试用到的数据库,在执行测试之前,会被清空,即使用空数据库. 2. 本文中的单元测试都是正确通过的. 要理解EF的事务机制,首先要理解这2个类:TransactionSco ...

  4. 分享我们项目中基于EF事务机制的架构 【转载】

    http://www.cnblogs.com/leotsai/p/how-to-use-entity-framework-transaction-scope.html 写在前面: 1. 本文中单元测试 ...

  5. OracleHelper(对增删改查分页查询操作进行了面向对象的封装,对批量增删改操作的事务封装)

    公司的一个新项目使用ASP.NET MVC开发,经理让我写个OracleHelper,我从网上找了一个比较全的OracleHelper类,缺点是查询的时候返回DataSet,数据增删改要写很多代码(当 ...

  6. 把事务封装成类似Serializable用法的特性

    把事务封装成类似Serializable用法的特性 最近几天上班没事可做就想着整理常用的类库方法,验证.消息.分页.模版引擎.数据库操作.ini操作.文本操作.xml操作等,最后就是现在这个事务特性. ...

  7. EF事务嵌套

    EF中采用的是数据上下文DbContext,当针对数据库的所有操作共用一个数据上下文的时候,会使用同一个连接对象,因此连接打开一次,最后Save的时候关闭连接,避免了频繁的创建连接对象打开关闭,这在一 ...

  8. MVC,EF 小小封装

    1.项目中经常要用到 EF,有时候大多数的增删改查都是重复性的东西,本次封装就是为了快速开发,期间没有考虑到架构上的各种思想,就感觉到欠缺点什么东西所以这次将这些拉出来,有存在问题的话还请各位多多指导 ...

  9. EF 事务(转载)

    事务简单用法 文章一:https://www.cnblogs.com/wujingtao/p/5407821.html 1EF事务 事务就是确保一次数据库操作,所有步骤都成功,如果哪一步出错了,整个操 ...

随机推荐

  1. ceilometer alarm 创建过程中的DB操作及优化

    创建一个ceilometer alarm需要4次DB操作: api/controllers/v2/alarms.py 1. is_over_quota 每一次都需要查询该user/project的所有 ...

  2. spring boot: @EnableScheduling开启计划任务支持,@Scheduled计划任务声明

    spring boot: @EnableScheduling开启计划任务支持, @Scheduled计划任务声明 package ch2.scheduler2; //日期转换方式 import jav ...

  3. mysql中使用instr替换like

    使用内部函数instr,可代替传统的like方式查询,并且速度更快. instr函数,第一个参数是字段,第二个参数是要查询的串,返回串的位置,第一个是1,如果没找到就是0. 实例: SELECT o. ...

  4. QT Creator引用win32 api类库方法(.lib)

    由于Qt Creator使用的是mingW进行程序编译,该编译方式无法识别#pragma comment(lib,"lib\\hvdailt.lib")引用. 所以需要在.Pro文 ...

  5. ZeroClipboard 简单应用

    ZeroClipboard.config({ swfPath: "/scripts/ZeroClipboard.swf" }); var client = new ZeroClip ...

  6. javascript queue 打字效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. LeetCode OJ:Rotate Array(倒置数组)

    Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array  ...

  8. (转)libcurl库使用方法,好长,好详细。

    一.ibcurl作为是一个多协议的便于客户端使用的URL传输库,基于C语言,提供C语言的API接口,支持DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP ...

  9. SVN管理多个项目版本库 (windows,linux 通用)

    SVN管理多个项目版本库: . 安装SVN服务器软件,路径: C:\Program Files\Subversion . 在D盘创建svn根目录D:\SVN-CM . 在D:\SVN-CM下创建SVN ...

  10. Knuth-Morris-Pratt 算法

    KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法).KMP算法的关键是利用匹配 ...