代码实现:
using System; using System.Data.SqlClient; using System.EnterpriseServices; using System.Reflection; namespace ComponentServiceModel { [assembly: ApplicationName("ComponentTransaction")] [Transaction(TransactionOption.Required)] public class TransactionExample : ServicedComponent { public TransactionExample() { } [AutoComplete(true)] public bool WriteData(string commandText,string commandText1) { try { //do something in different database ContextUtil.SetComplete(); return true; } catch { ContextUtil.SetAbort(); return false; } } } }
黑体标注的部分是类型需要的特殊属性.。其中,try...catch语句块不是必须的,可以在WriteData方法体中编写我们正常的代码并假设这些代码是不会有任何异常发生的,也就是说我们不需要手动调用ContextUtil.SetComplete()和ContextUtil.SetAbort();。就像下面代码:
[AutoComplete(true)] public bool WriteData(string commandText,string commandText1) { //do something in different database }
在实际运行时,如果调用发生异常,WriteData会自动调用ContextUtil.SetAbort(),相反如果调用没有发生异常,WriteData就会自动调用ContextUtil.SetComplete()以完 成事务。
提示:
如果需要指定事务的超时时间,可 以下面代码标识一个类型
[Transaction(TransactionOption.Required, Isolation=TransactionIsolationLevel.Serializable, Timeout=10)]
在使用AutoComplete属性标记一个方法时,如果将AutoComplete指定为[AutoComplete(false)]或忽略该属性,则需要手动去管理事务,就像以下代码所示
[AutoComplete(false)] public bool WriteData(string commandText, string commandText1) { try { //do something in different database ContextUtil.SetComplete(); return true; } catch { ContextUtil.SetAbort(); return false; } }
相关类型解释:
1、[Transaction(TransactionOption.Required)]
属性Transaction用标识TransactionExample为一个事务性组件
2、[AutoComplete]
属性AutoComplete用于标识方法WriteData如果正常返回,则事务自动提交(SetComplete),否则中止事务(SetAbort)。
有关属性Transaction与AutoComplete的详细资料,参见MSDN:
Transaction
http://msdn2.microsoft.com/zh-cn/library/system.enterpriseservices.transactionattribute(VS.80).aspx
AutoComplete
http://msdn2.microsoft.com/zh-cn/library/system.enterpriseservices.autocompleteattribute(VS.80).aspx