我想在C#中首次使用嵌套事務。在過去,我總是將包裹在SqlTransactions
裏面SqlConnections
。事情是這樣的:嵌套的TransactionScope()將不會回滾
using (SqlConnection myCon = new SqlConnection(...))
using (SqlTransaction myTran = myCon.BeginTransaction())
{
using (SqlCommand myCom1 = new SqlCommand("...", myCon, myTran))
{
...
}
using (SqlCommand myCom2 = new SqlCommand("...", myCon, myTran))
{
...
}
.
.
.
myTran.Commit();
}
}
所有這一切,必要try...catch
處理過程的,所以如果一個異常SqlTransaction
內的任何地方發生,我知道沒有SqlCommands
的將被提交。
所以我想我會給TransactionScope一個嘗試,但它不工作。這是我正在做的事情;我有兩個交易,一個接一個,但都在一個外部交易中。根據表單上選中哪個複選框,代碼將引發以下異常: 1.恰好在第一個內部事務的提交之前,或者 2.在兩個內部事務之間,或者 3.就在第二個內部事務的提交之前,或 4.就在外部交易提交之前
我得到的問題是,無論我勾選哪個複選框,代碼都會執行,就好像沒有交易存在一樣。換句話說,由於異常導致跳出try塊的事實不會回滾任何事務。
希望得到一些幫助。以下是我的小測試應用程序的代碼。
try
{
using (SqlConnection sqlConnection = new SqlConnection(connectionString))
{
sqlConnection.Open();
using (TransactionScope transactionOuter = new TransactionScope())
{
using (TransactionScope transactionInner1 = new TransactionScope())
{
using (SqlCommand sqlCommand = new SqlCommand("INSERT INTO BasicTable (Value) VALUES ('Inside Inner Transaction 1')", sqlConnection))
{
sqlCommand.ExecuteNonQuery();
}
if (checkBox_FailInner1.Checked)
throw (new Exception("Failed inside inner transaction 1"));
transactionInner1.Complete();
}
if (checkBox_FailBetween.Checked)
throw (new Exception("Failed between inner transactions"));
using (TransactionScope transactionInner2 = new TransactionScope())
{
using (SqlCommand sqlCommand = new SqlCommand("INSERT INTO BasicTable (Value) VALUES ('Inside Inner Transaction 2')", sqlConnection))
{
sqlCommand.ExecuteNonQuery();
}
if (checkBox_FailInnner2.Checked)
throw (new Exception("Failed inside inner transaction 2"));
transactionInner2.Complete();
}
if (checkBox_FailOuter.Checked)
throw (new Exception("Failed before outer transaction could commit"));
transactionOuter.Complete();
}
}
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
MessageBox.Show("Done");
那麼,你有哪些例外? –
我沒有得到任何異常,或者至少沒有任何異常,我沒有投擲自己。關鍵是,我期待這一點,當我在我所做的四點中的任何一點處拋出異常時,最終應導致外部事務回滾,因此沒有任何SQL命令應該對數據庫進行永久更改。這沒有發生。無論我在哪裏拋出異常,上述示例中的事務都不會回滾。 –