事务就是确保一次数据库操作,所有步骤都成功,如果哪一步出错了,整个操作都将回滚。在EF使用事务有两种方案,一种是EF自带的.BeginTransaction()方法,另一种是使用TransactionScope类。
TransactionScope
using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
scope.Complete();
}
using (var db = new DBModel())
{
using (var tran = new TransactionScope()) //开启事务
{
var student = db.students.FirstOrDefault(s => s.name == "萝莉");
db.students.Remove(student); //删除萝莉
db.SaveChanges();
tran.Complete(); //必须调用.Complete(),不然数据不会保存
}//出了using代码块如果还没调用Complete(),所有操作就会自动回滚
}
TransactionScope事务类,它可以使代码块成为事务性代码。并自动提升为分布式事务 优点:实现简单,同时能够自动提升为分布式事务
BeginTransaction
using (var context = new BloggingContext())
{
using (var dbContextTransaction = context.Database.BeginTransaction())
{
try{
sqlTxn.Commit();
}
catch (Exception)
{
sqlTxn.Rollback();
}
}
}
using (var db = new DBModel())
{
var tran = db.Database.BeginTransaction(); //开启事务
try
{
var student = db.students.FirstOrDefault(s => s.name == "萝莉");
db.students.Remove(student); //删除萝莉
db.SaveChanges();
tran.Commit(); //必须调用Commit(),不然数据不会保存
}
catch (Exception ex)
{
tran.Rollback(); //出错就回滚
}
}