天天看点

在组件之间实现事务和异步提交事务(NET2.0)

假设要Insert1个用户和该用户对应角色,而这2个Insert方法已经封装到2个dll中了,现在要在这个2个方法中实现事务,代码很简单,如下(需先添加对System.Transactions程序集的引用)

 1

在组件之间实现事务和异步提交事务(NET2.0)

public void Insert(string UserName,ArrayList alRoles)

 2

在组件之间实现事务和异步提交事务(NET2.0)

{

 3

在组件之间实现事务和异步提交事务(NET2.0)

using (TransactionScope _ts = new TransactionScope())

 4

在组件之间实现事务和异步提交事务(NET2.0)

 5

在组件之间实现事务和异步提交事务(NET2.0)

     //插入用户

 6

在组件之间实现事务和异步提交事务(NET2.0)

      new user().Insert(UserName);

 7

在组件之间实现事务和异步提交事务(NET2.0)

 8

在组件之间实现事务和异步提交事务(NET2.0)

     //  插入角色

 9

在组件之间实现事务和异步提交事务(NET2.0)

       new Role().Insert(UserName,alRoles);

10

在组件之间实现事务和异步提交事务(NET2.0)

11

在组件之间实现事务和异步提交事务(NET2.0)

      _ts.Complete();

12

在组件之间实现事务和异步提交事务(NET2.0)

}

13

在组件之间实现事务和异步提交事务(NET2.0)

异步提交事务的代码也很简单:

 1        public void Work()

在组件之间实现事务和异步提交事务(NET2.0)

        {

在组件之间实现事务和异步提交事务(NET2.0)

            Transaction _old = Transaction.Current;

在组件之间实现事务和异步提交事务(NET2.0)

            CommittableTransaction _newCommit = new CommittableTransaction();

在组件之间实现事务和异步提交事务(NET2.0)

            Transaction.Current = _newCommit;

在组件之间实现事务和异步提交事务(NET2.0)
在组件之间实现事务和异步提交事务(NET2.0)

            try

在组件之间实现事务和异步提交事务(NET2.0)

            {

在组件之间实现事务和异步提交事务(NET2.0)

                _newCommit.BeginCommit(OnCommit, null);

在组件之间实现事务和异步提交事务(NET2.0)

            }

在组件之间实现事务和异步提交事务(NET2.0)

            finally

12            {

13                Transaction.Current = _old;

14            }

15

在组件之间实现事务和异步提交事务(NET2.0)

        }

16

在组件之间实现事务和异步提交事务(NET2.0)

        void OnCommit(IAsyncResult asy)

17        {

18

在组件之间实现事务和异步提交事务(NET2.0)

            CommittableTransaction _commit;

19

在组件之间实现事务和异步提交事务(NET2.0)

            _commit = asy as CommittableTransaction;

20

在组件之间实现事务和异步提交事务(NET2.0)

21            try

22            {

23                using (_commit)

24                {

25

在组件之间实现事务和异步提交事务(NET2.0)

                    SqlConnection _cnn = new SqlConnection("

在组件之间实现事务和异步提交事务(NET2.0)

");

26                    SqlCommand _cmd = new SqlCommand();

27

在组件之间实现事务和异步提交事务(NET2.0)

28

在组件之间实现事务和异步提交事务(NET2.0)

29                    _cnn.Open();

30

在组件之间实现事务和异步提交事务(NET2.0)

31                    _cnn.EnlistTransaction(_commit);    //  利用事务

32

33                    _cmd.Connection = _cnn;

34

35                    _cmd.CommandText = "

在组件之间实现事务和异步提交事务(NET2.0)

.";

36                    _cmd.ExecuteNonQuery();

37

在组件之间实现事务和异步提交事务(NET2.0)

38                    _cmd.CommandText = "

在组件之间实现事务和异步提交事务(NET2.0)

";

39                    _cmd.ExecuteNonQuery();

40

41

在组件之间实现事务和异步提交事务(NET2.0)

                    _commit.EndCommit(asy);

42

在组件之间实现事务和异步提交事务(NET2.0)

43

在组件之间实现事务和异步提交事务(NET2.0)

                    _cnn.Close();

44

在组件之间实现事务和异步提交事务(NET2.0)

                }

45

在组件之间实现事务和异步提交事务(NET2.0)

46

在组件之间实现事务和异步提交事务(NET2.0)

            catch (Exception e)

47

在组件之间实现事务和异步提交事务(NET2.0)

48

在组件之间实现事务和异步提交事务(NET2.0)

49

在组件之间实现事务和异步提交事务(NET2.0)

50

在组件之间实现事务和异步提交事务(NET2.0)

上面我们用TransactionScope和CommittableTransaction。

TransactionScope是隐示的,是由系统自动管理的,所以它没有什么RollBack方法。

CommittableTransaction是显示的,它有commit和RollBack方法。

------------------------------------------

以上都是个人的看法和体会,如有不妥处,还请大家多多指点,谢谢!

本文转自BearRui(AK-47)博客园博客,原文链接:http://www.cnblogs.com/BearsTaR/archive/2006/04/17/Transactions.html    ,如需转载请自行联系原作者

继续阅读