多數據庫事務處理
看見園子里面一位高人寫了一篇多數據庫事務處理的東西,覺得很有意思,把它重寫了一下。
在一個數據庫中實現事務是沒什么問題,當時項目中常常會遇到多個數據庫交叉事務的情況,這個方法使用兩個SqlTransaction 來處理這兩個數據庫中的事務,當一個更新不成功兩個都要回滾。
public void TransactionDebug()
{
string sql1 = @"Data Source=XXXXXX;Initial Catalog=stuDB;Integrated Security=True";
string sql2 = @"Data Source=XXXXXX;Initial Catalog=Northwind;Integrated Security=True";
SqlConnection conn1 = new SqlConnection(sql1);
SqlConnection conn2 = new SqlConnection(sql2);
string sqlUpdate1 = "UPDATE stuInfo SET stuAddress='江南' WHERE stuNO='s25301'";
string sqlUpdate2 = "UPDATE Products SET ProductName='Chian' WHERE ProductID=1";
SqlCommand sc1 = new SqlCommand(sqlUpdate1, conn1);
SqlCommand sc2 = new SqlCommand(sqlUpdate2, conn2);
conn1.Open();
SqlTransaction sqlTran1 = conn1.BeginTransaction();
conn2.Open();
SqlTransaction sqlTran2 = conn2.BeginTransaction();
int effectrow=0;
using(TransactionScope tranScope = new TransactionScope())
{
try
{
sc1.Transaction = sqlTran1;
effectrow += sc1.ExecuteNonQuery();
sc2.Transaction = sqlTran2;
effectrow += sc2.ExecuteNonQuery();
}
catch(SqlException ex)
{
sqlTran1.Rollback();
sqlTran2.Rollback();
conn1.Close();
conn2.Close();
throw ex;
}
if(effectrow == 2)
{
sqlTran1.Commit();
sqlTran2.Commit();
}
else
{
sqlTran1.Rollback();
sqlTran2.Rollback();
}
conn1.Close();
conn2.Close();
}
}
作者:Tyler Ning
出處:http://www.rzrgm.cn/tylerdonet/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,如有問題,請微信聯系冬天里的一把火
浙公網安備 33010602011771號