57 lines
1.9 KiB
C#
57 lines
1.9 KiB
C#
using Microsoft.AspNetCore.Mvc.Filters;
|
||
using Microsoft.EntityFrameworkCore;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
using System.Transactions;
|
||
|
||
namespace CloudBuilder.Core.DatabaseAccessor
|
||
{
|
||
/*
|
||
事务范围不匹配:TransactionScope 管理的是分布式事务,但对于单个数据库连接,通常不需要分布式事务。
|
||
OnActionExecutionAsync 是 ASP.NET Core 中异步的 Action 过滤器执行方法。
|
||
// OnActionExecuting: Action 执行前
|
||
[开始事务]
|
||
↓
|
||
[Action 方法执行]
|
||
↓
|
||
// OnActionExecuted: Action 执行后(无论是否异常)
|
||
[检查异常]
|
||
[提交或回滚事务]
|
||
*/
|
||
[AttributeUsage(AttributeTargets.Method)]
|
||
public class UnitOfWorkAttribute : ActionFilterAttribute
|
||
{
|
||
private TransactionScope _transactionScope;
|
||
|
||
public override void OnActionExecuting(ActionExecutingContext context)
|
||
{
|
||
_transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew,
|
||
new TransactionOptions
|
||
{
|
||
IsolationLevel = IsolationLevel.ReadCommitted,
|
||
Timeout = TransactionManager.MaximumTimeout
|
||
});
|
||
|
||
base.OnActionExecuting(context);
|
||
}
|
||
|
||
public override void OnActionExecuted(ActionExecutedContext context)
|
||
{
|
||
if (_transactionScope != null)
|
||
{
|
||
if (context.Exception == null)
|
||
{
|
||
//必须要有 SaveChanges() 调用,否则数据只会停留在内存中,不会真正保存到数据库。
|
||
_transactionScope.Complete();
|
||
}
|
||
_transactionScope.Dispose();
|
||
}
|
||
|
||
base.OnActionExecuted(context);
|
||
}
|
||
}
|
||
}
|