假設要Insert1個使用者和該使用者對應角色,而這2個Insert方法已經封裝到2個dll中了,現在要在這個2個方法中實作事務,代碼很簡單,如下(需先添加對System.Transactions程式集的引用)
1

public void Insert(string UserName,ArrayList alRoles)
2
{
3
using (TransactionScope _ts = new TransactionScope())
4
5
//插入使用者
6
new user().Insert(UserName);
7
8
// 插入角色
9
new Role().Insert(UserName,alRoles);
10
11
_ts.Complete();
12
}
13
異步送出事務的代碼也很簡單:
1 public void Work()
{
Transaction _old = Transaction.Current;
CommittableTransaction _newCommit = new CommittableTransaction();
Transaction.Current = _newCommit;
try
{
_newCommit.BeginCommit(OnCommit, null);
}
finally
12 {
13 Transaction.Current = _old;
14 }
15
}
16

void OnCommit(IAsyncResult asy)
17 {
18
CommittableTransaction _commit;
19
_commit = asy as CommittableTransaction;
20
21 try
22 {
23 using (_commit)
24 {
25
SqlConnection _cnn = new SqlConnection("
");
26 SqlCommand _cmd = new SqlCommand();
27
28
29 _cnn.Open();
30
31 _cnn.EnlistTransaction(_commit); // 利用事務
32
33 _cmd.Connection = _cnn;
34
35 _cmd.CommandText = "
.";
36 _cmd.ExecuteNonQuery();
37
38 _cmd.CommandText = "
";
39 _cmd.ExecuteNonQuery();
40
41
_commit.EndCommit(asy);
42
43
_cnn.Close();
44
}
45
46
catch (Exception e)
47
48
49
50
上面我們用TransactionScope和CommittableTransaction。
TransactionScope是隐示的,是由系統自動管理的,是以它沒有什麼RollBack方法。
CommittableTransaction是顯示的,它有commit和RollBack方法。
------------------------------------------
以上都是個人的看法和體會,如有不妥處,還請大家多多指點,謝謝!
本文轉自BearRui(AK-47)部落格園部落格,原文連結:http://www.cnblogs.com/BearsTaR/archive/2006/04/17/Transactions.html ,如需轉載請自行聯系原作者