RollBack 範例 TransactionScope 補充Transaction測試
SqlConnection myConnection = new SqlConnection("DB String");
SqlCommand sqlCommand = myConnection.CreateCommand();
sqlCommand.Connection = myConnection;
// 上述兩段可以合成為 SqlCommand sqlCommand = new SqlCommand("" , myConnection);
//第一個"" 是因為需要一個string的cmdName 隨便都行
SqlTransaction sqlTransaction = myConnection.BeginTransaction(IsolationLevel.ReadCommitted);
sqlCommand.Transaction = sqlTransaction ;
第一種
try {
myConnection.open();
//sql command
sqlTransaction.Commit();
return "成功";
第二種
TransactionScope tranaction = new TransactionScope();
try{
//sql command
tranaction.Complete();
tranaction.Dispose();
}catch(Exception ex){
return "error";
}
以下介紹如何在一個大交易裡面單獨完成一個小交易
TransactionScope tranaction = new TransactionScope();
try{
//sql command 01
//sql command 02
tranaction.Complete();
tranaction.Dispose();
}catch(Exception ex){
return "error";
}
由於你在這個交易內 假如交易內容有問題 導致沒有經過Complete
那sql 01 跟 02都會進行rollback 導致都不會寫入
因此在這種情形下 可以單獨做
TransactionScope tranaction = new TransactionScope();
try{
//sql command 01
using (TransactionScope tranaction2 = new TransactionScope(TransactionScopeOption.RequiresNew)) {
//sql command 02
tranaction2.Complete();
tranaction2.Dispose();
}
tranaction.Complete();
tranaction.Dispose();
}catch(Exception ex){
return "error";
}
這樣的話黃標處若成功就會單獨執行了
參考 https://docs.microsoft.com/zh-tw/dotnet/api/system.data.sqlclient.sqltransaction.rollback?view=dotnet-plat-ext-5.0
https://blog.darkthread.net/blog/transcope-and-commit-tran/
留言
張貼留言