ef mysql 事务_EF中使用事务 - 李超明的个人空间 - OSCHINA - 中文开源技术交流社区...

1.EF中的默认的事务

默认情况下,当我们执行一个SaveChanges()方法时就会新建了一个事务,然后将context中的CUD操作都在这个事务中进行。Context中有多个SaveChanges()时,每一个SaveChanges()都会执行一个单独的事务。一个栗子:

using (var context = newSchoolContext())

{

context.Database.Log=Console.Write;var standard = context.Standards.Add(new Standard() { StandardName = "1st Grade"});

context.Students.Add(newStudent()

{

FirstName= "Rama",

StandardId=standard.StandardId

});

context.SaveChanges();

context.Courses.Add(new Course() { CourseName = "Computer Science"});

context.SaveChanges();

}

上边的代码执行结果如下:

4427f15a51911d46c0034caf366ea797.png

从上边的栗子我们可以清楚地看到每个SaveChanges()方法都开启了一个事务。这时有一个问题:有没有什么办法让多个SaveChanges()在一个事务中执行呢?这样的话就可以减少事务创建、开启进而提升性能了。

2.一个事务执行多个SaveChanges()方法

EF6和EF core中提供了两种方法实现在一个事务中执行多个SaveChanges()方法。

①DbContext.Database.BeginTrasaction():新建一个事务,在新建的事务内进行context.SaveChanges()

②DbContext.Database.UseTransaction(trans):使用一个context作用域外的现有的事务,多个context都可以在通过这个事务一起提交。

1.DbContext.Database.BeginTrasaction()

一个栗子:

using (var context = newSchoolContext())

{

context.Database.Log=Console.Write;using (DbContextTransaction transaction =context.Database.BeginTransaction())

{try{var standard = context.Standards.Add(new Standard() { StandardName = "1st Grade"});

context.Students.Add(newStudent()

{

FirstName= "Rama",

StandardId=standard.StandardId

});

context.SaveChanges();//第一个SaveChanges()方法后抛出异常

throw newException();

context.Courses.Add(new Course() { CourseName = "Computer Science"});

context.SaveChanges();

transaction.Commit();

}catch(Exception ex)

{

transaction.Rollback();

Console.WriteLine("Error occurred.");

}

}

}

执行结果:

2c87c4c1bedc353eb0abbe1eeef50148.png

我们可以看到所有的SaveChanges()都被回滚了。如果把抛出异常的代码注释掉那么执行效果如下:

e86a03852f4adb9722325d59f9c1ca3d.png

2.DbContext.Database.UseTransaction(trans)

使用DbContext.Database.UseTransaction(trans),我们通过参数传入的是一个作用域外的事务,注意:这里EF不会再新建内置的事务,而是使用通过参数传入的事务。

一个栗子:

private static void Main(string[] args)

{string providerName = "System.Data.SqlClient";string serverName = ".";string databaseName = "SchoolDB";//目标数据库

SqlConnectionStringBuilder sqlBuilder =newSqlConnectionStringBuilder();

sqlBuilder.DataSource=serverName;

sqlBuilder.InitialCatalog=databaseName;

sqlBuilder.IntegratedSecurity= true;using (SqlConnection con = newSqlConnection(sqlBuilder.ToString()))

{

con.Open();//在DbContext作用域外新建一个事务

using (SqlTransaction transaction =con.BeginTransaction())

{try{//使用上边的创建的事务

using (SchoolContext context = new SchoolContext(con, false))

{

context.Database.UseTransaction(transaction);

context.Students.Add(new Student() { Name = "Ravi"});

context.SaveChanges();

}using (SchoolContext context = new SchoolContext(con, false))

{

context.Database.UseTransaction(transaction);

context.Grades.Add(new Standard() { GradeName = "Grade 1", Section = "A"});

context.SaveChanges();

}

transaction.Commit();

}catch(Exception ex)

{

transaction.Rollback();

Console.WriteLine(ex.InnerException);

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值