Skip to content

事务

当你需要让多次写操作共享同一个连接和事务时,优先使用 UnitOfWork。如果你只是单条写入,直接调用 builder 的 Execute / ExecuteAsync 就够了。

使用工作单元(Unit of Work)

同步示例

csharp
using (var uow = Db.CreateUnitOfWork())
{
    Db.Insert(entity).Execute(uow.DbTransaction);
    Db.Update(entity).Execute(uow.DbTransaction);
    uow.Commit();
}

异步示例

csharp
using (var uow = Db.CreateUnitOfWork())
{
    await Db.Insert(entity).ExecuteAsync(uow.DbTransaction);
    await Db.Update(entity).ExecuteAsync(uow.DbTransaction);
    await uow.CommitAsync();
}

指定隔离级别

csharp
using (var uow = Db.CreateUnitOfWork(IsolationLevel.ReadCommitted))
{
    await Db.Insert(entity).ExecuteAsync(uow.DbTransaction);
    await Db.Delete(otherEntity).ExecuteAsync(uow.DbTransaction);
    await uow.CommitAsync();
}

使用原生事务

如果你已经手动管理 DbConnection,也可以直接把 IDbTransaction 传给 builder:

同步示例

csharp
using (var dbConnection = Db.CreateDbConnection())
{
    dbConnection.Open();
    using (var transaction = dbConnection.BeginTransaction())
    {
        try
        {
            Db.Insert(entity).Execute(transaction);
            Db.Update(entity).Execute(transaction);

            transaction.Commit();
        }
        catch (Exception)
        {
            transaction.Rollback();
            throw;
        }
    }
}

异步示例

csharp
using (var dbConnection = Db.CreateDbConnection())
{
    dbConnection.Open();
    using (var transaction = await dbConnection.BeginTransactionAsync())
    {
        try
        {
            await Db.Insert(entity).ExecuteAsync(transaction);
            await Db.Update(entity).ExecuteAsync(transaction);

            await transaction.CommitAsync();
        }
        catch (Exception)
        {
            await transaction.RollbackAsync();
            throw;
        }
    }
}

选哪种

  • 如果你在业务里已经有 DbConnection,直接用原生事务。
  • 如果你希望少写样板代码,并且让多次操作自动共享连接,优先用 UnitOfWork