事务
当你需要让多次写操作共享同一个连接和事务时,优先使用 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。