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 ;


// 甚至可以把這邊都變成
// SqlCommand sqlCommand = new SqlCommand("" , myConnection , sqlTransaction );
SqlCommand(string cmdtxt , SqlConnection sqlConnection , SqlTransaction sqlTransaction);

第一種

try {

myConnection.open();

//sql command 

sqlTransaction.Commit();

return "成功";

}catch(Exception ex){
  try{
    sqlTransaction.Rollback();
  }catch(SqlException sqlex){
      if (trans.Connection != null)
      return "RollBack error";
    }
  return "error but RollBack";
}

第二種

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/



留言

這個網誌中的熱門文章

無法載入檔案或組件 'System.IO.Compression' 或其相依性的其中之一。

MongoDB 入門

javascript 更改屬性及創建標籤