重庆熊猫 Loading

Entity Framework教程-事务(Transaction)

更新记录
转载请注明出处:
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;
    }
}
posted @ 2022-10-21 10:35  重庆熊猫  阅读(340)  评论(0编辑  收藏  举报