该类是支持两阶段提交协议的资源管理器,由于不同的资源面临这不同的数据复制操作。当我们进行初始数据备份的时候需要对不同的数据类型进行不同的数据复制操作,所以我们需要一个规范来进行约定。
代码2:资源复制接口
-
-
-
- public interface IResourceCopy<T>
- {
- void Copy(T t1, T t2);
- }
|
代码3:实现StringBuilder类型的数据复制
-
-
-
- public class StringBuilderCopy : IResourceCopy<StringBuilder>
- {
-
- #region IResourceCopy<StringBuilder> 成员
-
- public void Copy(StringBuilder t1, StringBuilder t2)
- {
- t1.Remove(0, t1.Length);
- t1.Append(t2.ToString());
- }
-
- #endregion
- }
|
这样我们就有了对于StringBuilder类型的数据复制操作类。
代码4:将自定义的资源管理器参与到事务处理中
-
-
-
- public class EnlistmentDemo
- {
- [MethodImpl(MethodImplOptions.Synchronized)]
- public void Start()
- {
-
- StringBuilder stringvalues = new StringBuilder("123");
- StringBuilder stringvalues2 = new StringBuilder("456");
- StringBuilder stringvalues3 = new StringBuilder("789");
- StringBuilder stringvalues4 = new StringBuilder("101112");
-
- IEnlistmentNotificationDemo<StringBuilder, StringBuilderCopy> resource =
- new IEnlistmentNotificationDemo<StringBuilder, StringBuilderCopy>(stringvalues, new StringBuilderCopy());
- IEnlistmentNotificationDemo<StringBuilder, StringBuilderCopy> resource2 =
- new IEnlistmentNotificationDemo<StringBuilder, StringBuilderCopy>(stringvalues2, new StringBuilderCopy());
- IEnlistmentNotificationDemo<StringBuilder, StringBuilderCopy> resource3 =
- new IEnlistmentNotificationDemo<StringBuilder, StringBuilderCopy>(stringvalues3, new StringBuilderCopy());
- IEnlistmentNotificationDemo<StringBuilder, StringBuilderCopy> resource4 =
- new IEnlistmentNotificationDemo<StringBuilder, StringBuilderCopy>(stringvalues4, new StringBuilderCopy());
- try
- {
- using (TransactionScope transcope = new TransactionScope())
- {
- Transaction.Current.TransactionCompleted += new TransactionCompletedEventHandler(commitran_TransactionCompleted);
-
- Transaction.Current.EnlistVolatile(resource, EnlistmentOptions.None);
- Transaction.Current.EnlistVolatile(resource2, EnlistmentOptions.None);
- Transaction.Current.EnlistVolatile(resource3, EnlistmentOptions.None);
- Transaction.Current.EnlistVolatile(resource4, EnlistmentOptions.None);
-
- stringvalues.Append("456");
- stringvalues2.Append("789");
- stringvalues3.Append("101112");
- stringvalues4.Append("131415");
- transcope.Complete();
- }
- }
- catch { Console.WriteLine("事务执行出错,执行回滚"); }
-
-
- Console.WriteLine("事务完成后的结果值:");
- Console.WriteLine(stringvalues + "|" + stringvalues2 + "|" + stringvalues3 + "|" + stringvalues4);
- }
-
-
- void commitran_TransactionCompleted(object sender, TransactionEventArgs e)
- {
- Console.WriteLine("transaction completed:");
- Console.WriteLine("ID: {0}", e.Transaction.TransactionInformation.LocalIdentifier);
- Console.WriteLine("Distributed ID: {0}", e.Transaction.TransactionInformation.DistributedIdentifier);
- Console.WriteLine("Status: {0}", e.Transaction.TransactionInformation.Status);
- Console.WriteLine("IsolationLevel: {0}", e.Transaction.IsolationLevel);
- }
- }
|