假设要Insert1个用户和该用户对应角色,而这2个Insert方法已经封装到2个dll中了,现在要在这个2个方法中实现事务,代码很简单,如下(需先添加对System.Transactions程序集的引用)
上面我们用TransactionScope和CommittableTransaction。
TransactionScope是隐示的,是由系统自动管理的,所以它没有什么RollBack方法。
CommittableTransaction是显示的,它有commit和RollBack方法。
------------------------------------------
以上都是个人的看法和体会,如有不妥处,还请大家多多指点,谢谢!
1
public void Insert(string UserName,ArrayList alRoles)
2
{
3
using (TransactionScope _ts = new TransactionScope())
4
{
5
//插入用户
6
new user().Insert(UserName);
7![](/Images/OutliningIndicators/InBlock.gif)
8
// 插入角色
9
new Role().Insert(UserName,alRoles);
10![](/Images/OutliningIndicators/InBlock.gif)
11
_ts.Complete();
12
}
13
}
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](/Images/OutliningIndicators/InBlock.gif)
4
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
5
![](/Images/OutliningIndicators/InBlock.gif)
6
![](/Images/OutliningIndicators/InBlock.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/InBlock.gif)
9
![](/Images/OutliningIndicators/InBlock.gif)
10
![](/Images/OutliningIndicators/InBlock.gif)
11
![](/Images/OutliningIndicators/InBlock.gif)
12
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
13
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
异步提交事务的代码也很简单:
1
public void Work()
2
{
3
Transaction _old = Transaction.Current;
4
CommittableTransaction _newCommit = new CommittableTransaction();
5
Transaction.Current = _newCommit;
6![](/Images/OutliningIndicators/InBlock.gif)
7
try
8
{
9
_newCommit.BeginCommit(OnCommit, null);
10
}
11
finally
12
{
13
Transaction.Current = _old;
14
}
15
}
16
void OnCommit(IAsyncResult asy)
17
{
18
CommittableTransaction _commit;
19
_commit = asy as CommittableTransaction;
20![](/Images/OutliningIndicators/InBlock.gif)
21
try
22
{
23
using (_commit)
24
{
25
SqlConnection _cnn = new SqlConnection("
");
26
SqlCommand _cmd = new SqlCommand();
27![](/Images/OutliningIndicators/InBlock.gif)
28![](/Images/OutliningIndicators/InBlock.gif)
29
_cnn.Open();
30![](/Images/OutliningIndicators/InBlock.gif)
31
_cnn.EnlistTransaction(_commit); // 利用事务
32![](/Images/OutliningIndicators/InBlock.gif)
33
_cmd.Connection = _cnn;
34![](/Images/OutliningIndicators/InBlock.gif)
35
_cmd.CommandText = "
.";
36
_cmd.ExecuteNonQuery();
37![](/Images/OutliningIndicators/InBlock.gif)
38
_cmd.CommandText = "
";
39
_cmd.ExecuteNonQuery();
40![](/Images/OutliningIndicators/InBlock.gif)
41
_commit.EndCommit(asy);
42![](/Images/OutliningIndicators/InBlock.gif)
43
_cnn.Close();
44
}
45
}
46
catch (Exception e)
47
{
48![](/Images/OutliningIndicators/InBlock.gif)
49
}
50
}
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](/Images/OutliningIndicators/InBlock.gif)
4
![](/Images/OutliningIndicators/InBlock.gif)
5
![](/Images/OutliningIndicators/InBlock.gif)
6
![](/Images/OutliningIndicators/InBlock.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
9
![](/Images/OutliningIndicators/InBlock.gif)
10
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
11
![](/Images/OutliningIndicators/InBlock.gif)
12
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
15
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
16
![](/Images/OutliningIndicators/None.gif)
17
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/InBlock.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
26
![](/Images/OutliningIndicators/InBlock.gif)
27
![](/Images/OutliningIndicators/InBlock.gif)
28
![](/Images/OutliningIndicators/InBlock.gif)
29
![](/Images/OutliningIndicators/InBlock.gif)
30
![](/Images/OutliningIndicators/InBlock.gif)
31
![](/Images/OutliningIndicators/InBlock.gif)
32
![](/Images/OutliningIndicators/InBlock.gif)
33
![](/Images/OutliningIndicators/InBlock.gif)
34
![](/Images/OutliningIndicators/InBlock.gif)
35
![](/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
36
![](/Images/OutliningIndicators/InBlock.gif)
37
![](/Images/OutliningIndicators/InBlock.gif)
38
![](/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
39
![](/Images/OutliningIndicators/InBlock.gif)
40
![](/Images/OutliningIndicators/InBlock.gif)
41
![](/Images/OutliningIndicators/InBlock.gif)
42
![](/Images/OutliningIndicators/InBlock.gif)
43
![](/Images/OutliningIndicators/InBlock.gif)
44
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
45
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
46
![](/Images/OutliningIndicators/InBlock.gif)
47
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
48
![](/Images/OutliningIndicators/InBlock.gif)
49
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
50
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
上面我们用TransactionScope和CommittableTransaction。
TransactionScope是隐示的,是由系统自动管理的,所以它没有什么RollBack方法。
CommittableTransaction是显示的,它有commit和RollBack方法。
------------------------------------------
以上都是个人的看法和体会,如有不妥处,还请大家多多指点,谢谢!