9.25 事务和工作单元
9.25.1 事务
事务指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
简单的说,事务就是并发控制的单位,是用户定义的一个操作序列。 而一个逻辑工作单元要成为事务,就必须满足 ACID 属性。
A:原子性(Atomicity):事务中的操作要么都不做,要么就全做C:一致性(Consistency):事务执行的结果必须是从数据库从一个一致性状态转换到另一个一致性状态I:隔离性(Isolation):一个事务的执行不能被其他事务干扰D:持久性(Durability):一个事务一旦提交,它对数据库中数据的改变就应该是永久性的
默认情况下,Fur 框架为每一次请求都开启了分布式事务,保证了每一次请求都是一个完整的 工作单元。当然,我们也可以手动管理事务。
9.25.2 工作单元
简单来说,就是为了保证一次完整的功能操作所产生的一些列提交数据的完整性,起着事务的作用。在计算机领域中,工作单元通常用 UnitOfWork 名称表示。
通常我们保证用户的每一次请求都是处于在一个功能单元中,也就是工作单元。
9.25.3 如何使用
9.25.3.1 自动管理
在 Fur 框架中,我们只需要在控制器 Action 中贴 [UnitOfWork] 特性即可开启工作单元模式,保证了每一次请求都是一个 工作单元,要么同时成功,要么同时失败。
9.25.3.2 手动管理
- 示例一
- 示例二
- 示例三
// 开启事务
using (var transaction = _testRepository.Database.BeginTransaction())
{
try
{
_testRepository.Insert(new Blog { Url = "http://blogs.msdn.com/dotnet" });
_testRepository.SaveChanges();
_testRepository.Insert(new Blog { Url = "http://blogs.msdn.com/visualstudio" });
_testRepository.SaveChanges();
var blogs = _testRepository.Entity
.OrderBy(b => b.Url)
.ToList();
// 提交事务
transaction.Commit();
}
catch (Exception)
{
// 回滚事务
transaction.RollBack();
}
}
9.25.4 工作单元特性说明
9.25.4.1 [UnitOfWork]
[UnitOfWork] 特性用来标记事务信息,如作用范围,隔离级别等。
Enabled:是否启动工作单元,默认trueScopeOption:定义事务范围行为,默认TransactionScopeOption.RequiredIsolationLevel:设置事务隔离级别,默认IsolationLevel.ReadCommitted;AsyncFlowOption:允许跨线程连续任务的事务流,如有异步操作需开启该选项,默认开启
特别注意
一旦方法贴了 [UnitOfWork(false)] 特性后,那么该方法不再启用工作单元模式,也就是不包含事务,也不会自动提交数据库。慎用!
9.25.5 反馈与建议
与我们交流
给 Fur 提 Issue。
了解更多
想了解更多 事务 知识可查阅 EF Core - 使用事务 章节。