我有2個表查詢和細節。 在保存按鈕點擊我寫回滾在c#
fbsave();
fbsavedetails();
fbsave()
保存數據的查詢表和fbsavedetails()
保存在細節表中的數據。
現在,如果在fbsavedetails()中發生錯誤,則兩個步驟都應該回滾。
是否有可能?
我有2個表查詢和細節。 在保存按鈕點擊我寫回滾在c#
fbsave();
fbsavedetails();
fbsave()
保存數據的查詢表和fbsavedetails()
保存在細節表中的數據。
現在,如果在fbsavedetails()中發生錯誤,則兩個步驟都應該回滾。
是否有可能?
可以明確創建事務,並通過周圍,即
using(var connection = ...)
{
connection.Open();
using (var tran = connection.BeginTransaction())
{
try
{
FBSave(connection, tran);
FBSaveDetails(connection, tran);
tran.Commit();
}
catch
{
tran.Rollback();
throw;
}
}
}
請注意,在這裏你必須也設置在每個命令Transaction
,因此,爲什麼你需要通過它,所有的命令必須位於同一個連接對象上。
或者:您可以使用TransactionScope
;重要的是,該Open()
發生內的TransactionScope
獲得自動入伍:
using(var tran = new TransactionScope())
{
FBSave();
FBSaveDetails();
tran.Complete();
}
或:
using(var tran = new TransactionScope())
using(var connection = ...)
{
connection.Open();
FBSave(connection);
FBSaveDetails(connection);
tran.Complete();
}
與TransactionScope
方法,你不需要設置什麼特別的東西 - 大部分它是自動的。當然,您可以選擇將連接傳遞給方法,但它們也可以獲得自己的連接,並且在大多數情況下它可以正常工作。
「在TransactionScope內部打開以獲取自動登記」是否否定了對DTC的需求? –
@MrMoose否,但是你*通常可以通過傳遞連接來避免對DTC的需要:如果你只在'TransactionScope'中使用一個連接對象,那麼它將被LTM而不是DTC處理(在所有版本中SQL Server> = 2005,IIRC) –
您可以使用TransactionScope。
using(var scope = new TransactionScope())
{
//Complete the transaction only when both inserts succeed.
scope.Complete();
}
如果您未完成事務範圍,它將被回滾。
有解決這個問題
MS Access或SQL服務器? – andy
你如何做你的數據層?存儲,程序? LINQ到SQL?連接的?斷開? –
你可以通過使用事務來做你想做的事情,http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction(v=vs.100).aspx – Raghuveer