多数据库事务处理:有待考究

转:http://www.cnblogs.com/tylerdonet/archive/2009/10/30/1592653.html

 在一个数据库中实现事务是没什么问题,当时项目中常常会遇到多个数据库交叉事务的情况,这个方法使用两个SqlTransaction 来处理这两个数据库中的事务,当一个更新不成功两个都要回滚。

 1 public void TransactionDebug()

 2   {

 3 

 4    string sql1 = @"Data Source=XXXXXX;Initial Catalog=stuDB;Integrated Security=True";

 5    string sql2 = @"Data Source=XXXXXX;Initial Catalog=Northwind;Integrated Security=True";

 6 

 7    SqlConnection conn1 = new SqlConnection(sql1);

 8    SqlConnection conn2 = new SqlConnection(sql2);

 9 

10    string sqlUpdate1 = "UPDATE stuInfo SET stuAddress='江南' WHERE stuNO='s25301'";

11    string sqlUpdate2 = "UPDATE Products SET ProductName='Chian' WHERE ProductID=1";

12 

13 

14    SqlCommand sc1 = new SqlCommand(sqlUpdate1, conn1);

15    SqlCommand sc2 = new SqlCommand(sqlUpdate2, conn2);

16 

17    conn1.Open();

18    SqlTransaction sqlTran1 = conn1.BeginTransaction();

19    conn2.Open();

20    SqlTransaction sqlTran2 = conn2.BeginTransaction();

21 

22    int effectrow=0;

23 

24    using(TransactionScope tranScope = new TransactionScope())

25    {

26     try

27     {

28      sc1.Transaction = sqlTran1;

29      effectrow += sc1.ExecuteNonQuery();

30 

31      sc2.Transaction = sqlTran2;

32      effectrow += sc2.ExecuteNonQuery();

33     }

34     catch(SqlException ex)

35     {

36      sqlTran1.Rollback();

37      sqlTran2.Rollback();

38      conn1.Close();

39      conn2.Close();

40 

41      throw ex;

42     }

43     if(effectrow == 2)

44     {

45      sqlTran1.Commit();

46      sqlTran2.Commit();

47     }

48     else

49     {

50      sqlTran1.Rollback();

51      sqlTran2.Rollback();

52     }

53 

54     conn1.Close();

55     conn2.Close();

56    }

57   }

 

你可能感兴趣的:(多数据库)