[Transaction]
public class UserInfoAction : SqlDAL
{
[TransactionMethod]
public void Add(UserInfo user)
{
StringBuilder sb = new StringBuilder();
sb.Append("UPDATE [UserInfo] SET Password='").Append(user.PassWord)
.Append("' WHERE UID=").Append(user.UID);
ExecuteNonQuery(sb.ToString());
}
}
極簡潔、非侵入式:想要事務加兩個標記,不要就移除。
public abstract class SqlDAL : ContextBoundObject
{
private SqlTransaction _sqlTrans;
public SqlTransaction SqlTrans
{
get
{
if (_sqlTrans == null)
{
object obj = CallContext.GetData(TransactionAop.ContextName);
if (obj != null && obj is SqlTransaction) _sqlTrans = (SqlTransaction)obj;
}
return _sqlTrans;
}
set { _sqlTrans = value; }
}
// ExecuteNonQuery 多載依 SqlTrans 切換執行模式...
}
ContextBoundObject:MSDN 定義為「所有上下文繫結類別的基類」,為 AOP 攔截提供基礎設施。CallContext:跨邊界傳遞交易物件的關鍵通道。ExecuteNonQuery 內部判斷 SqlTrans != null 決定使用交易或一般連線。