在SQL Server等数据库中可以将多条SQL语句放在一个Transaction中执行,以确保执行的完整性。
但是,在开发过程中如果某个功能或方法需要包含若干个操作。而这些操作又各自分布在独立的方法中,这时候我们如果想保持各个操作的独立性同时又要保证执行的完整性,使用传统的数据库事物就很难实现了。
.Net Framework2.0中的TransactionScope对象可以很好的实现我们的需求。
废话少说,上代码:
代码
1 private void button1_Click(object sender, EventArgs e)
2 {
3 using (TransactionScope tran = new TransactionScope())
4 {
5 if (!Method1())
6 return;
7 Method2();
8 ......
9 ......
10 tran.Complete();
11 }
12 }
13
14
15 private bool Method1()
16 {
17 string commandText = "insert into UserInfo(UserName) values('name1')";
18 SqlConnection connection = new SqlConnection(connectionString);
19 connection.Open();
20 .....
21 .....
22 connection.Close();
23 return result;
24 }
25
26 private bool Method2()
27 {
28 string commandText = "insert into UserInfo(UserName) values('name2')";
29 SqlConnection connection = new SqlConnection(connectionString);
30 connection.Open();
31 .....
32 .....
33 connection.Close();
34 return result;
35 }
2 {
3 using (TransactionScope tran = new TransactionScope())
4 {
5 if (!Method1())
6 return;
7 Method2();
8 ......
9 ......
10 tran.Complete();
11 }
12 }
13
14
15 private bool Method1()
16 {
17 string commandText = "insert into UserInfo(UserName) values('name1')";
18 SqlConnection connection = new SqlConnection(connectionString);
19 connection.Open();
20 .....
21 .....
22 connection.Close();
23 return result;
24 }
25
26 private bool Method2()
27 {
28 string commandText = "insert into UserInfo(UserName) values('name2')";
29 SqlConnection connection = new SqlConnection(connectionString);
30 connection.Open();
31 .....
32 .....
33 connection.Close();
34 return result;
35 }
通过调用TransactionScope的Complete()可以实现数据库操作的提交。若未调用该方法,则在TransactionScope块中的相关数据访问不会生效。
Complete()要放到最后调用。如果在Method2()调用之前调用了该方法,则系统会抛出一个"当前 TransactionScope 已完成。"的InvalidOperationException异常。
最后,需要注意的一点是数据库打开操作要放在TransactionScope块中。

浙公网安备 33010602011771号