更新记录
转载请注明出处:
2022年10月21日 发布。
2022年10月10日 从笔记迁移到博客。
EF中的事务说明
EF支持开箱即用的事务,无需复杂的配置
默认事务(Default Transaction)
只需要执行SaveChanges()一次,将会自动执行事务
只在事务执行成功的情况下保存更改,否则事务将自动回滚
比如:
更改了多个Entity
只需要执行SaveChanges()一次就可以实现多个表的更新
如果执行失败,则全部回滚(rolled back automatically)
如果执行成功,则直接提交到数据库中(executed successfully)
手动事务(Creating a simple transaction)
相关API
开启事务
使用EF上下文context对象的Database对象的BeginTransaction()方法
var transaction = Context.Database.BeginTransaction()
提交事务
context.SaveChangesAsync(); //记得还是要保存修改哟
//提交事务
transaction.Commit();
transaction.CommitAsync();
回滚事务
//回滚事务
transaction.Rollback();
transaction.RollbackAsync();
创建保存点
//创建保存点
transaction.CreateSavepoint("Save1");
transaction.CreateSavepointAsync("Save1");
恢复到保存点
//恢复到保存点
transaction.RollbackToSavepoint("Save1");
transaction.RollbackToSavepointAsync("Save1");
释放保存点
//释放保存点
transaction.ReleaseSavepoint("Save1");
transaction.ReleaseSavepointAsync("Save1");
检测是否支持保存点功能
//检测是否支持保存点功能
if(transaction.SupportsSavepoints)
{
Console.WriteLine("Support Savepoints");
}
else
{
Console.WriteLine("Not Support Savepoints");
}
获得事务的Id
//获得事务的Id
Console.WriteLine(transaction.TransactionId);
使用using语句
使用using语句的好处:自动控制事务执行失败回滚,无需手动设置回滚
using (var transaction = dbContext.Database.BeginTransaction())
{
//do something......
//提交事务
transaction.Commit();
transaction.CommitAsync();
}
自己把控提交和回滚
using(PandaDbContext dbContext = new PandaDbContext())
{
var transaction = dbContext.Database.BeginTransaction();
try
{
//do something......
//执行成功,提交事务
transaction.Commit();
transaction.CommitAsync();
}
catch(Exception e)
{
Console.WriteLine(e.Message);
//执行失败,进行回滚
transaction.Rollback();
}
finally
{
transaction = null;
}
}