天天看點

在元件之間實作事務和異步送出事務(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    ,如需轉載請自行聯系原作者

繼續閱讀