簡體   English   中英

如何使用ADO.NET和SQL Server啟用嵌套事務?

[英]How do I enable nested transactions with ADO.NET and SQL Server?

我有類似的問題來檢查你是否在交易中 而不是檢查,我如何允許嵌套事務?

我正在使用Microsoft SQL Server數據庫與ADO.NET。 我已經看到了使用T-SQL的示例以及使用begin和使用事務名​​稱啟動事務的示例。 當調用connection.BeginTransaction時,我在同一個連接中調用另一個函數,並再次調用BeginTransaction,這給了我異常:

SqlConnection does not support parallel transactions.

似乎許多Microsoft變種允許這樣做,但我無法弄清楚如何使用我的.mdf文件。

如何使用C#和ADO.NET允許嵌套事務與Microsoft SQL Server數據庫?

SQL Server作為一個整體不支持嵌套事務。 在T-SQL可以發出BEGIN TRAN較早內BEGIN TRAN但是這僅僅是為了方便。 這只是外部交易的重要性。 SQL Server的.NET客戶端( SqlConnection )甚至不允許您這樣做,並在您嘗試時拋出此異常。

SQL Server支持嵌套事務是一種常見的誤解。 它不是。 打開多個事務,然后調用commit絕對沒有。 您可以輕松編寫一些測試SQL來自己嘗試。 這里模擬嵌套事務的唯一選擇是使用Savepoints。

我應該補充一點,唯一重要的是當@@ TRAN_COUNT達到零時,只有外部事務才會被提交。

SqlConnection conn = new SqlConnection(@"Data Source=test;Initial Catalog=test;User ID=usr;Password=pass");
conn.Open();
var com = conn.CreateCommand();

com.CommandText = "BEGIN TRANSACTION";
com.ExecuteNonQuery();
com.CommandText = "BEGIN TRANSACTION";
com.ExecuteNonQuery();
com.CommandText = "INSERT INTO testTable (ParamName,ParamValue) values ('test','test');";
com.ExecuteNonQuery();
com.CommandText = "COMMIT TRANSACTION";
com.ExecuteNonQuery();
com.CommandText = "ROlLBACK TRANSACTION";
com.ExecuteNonQuery();

com.CommandText = "SELECT COUNT(*) FROM testTable ";

MessageBox.Show(string.Format("Found {0} rows.", com.ExecuteScalar()));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM