關於使用事務有幾點不太明確:
1事務對象關聯的Connection對象在操作的時候不能被其他對象調用,但大部分代碼沒有用lock鎖住,是否在OracleTransaction對象中已經封裝好了呢?
2OracleTransaction對象的創建需要借助Connection對象來做,不能獨立創建么?
下面是測試過的代碼:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Configuration; using System.Data; using Oracle.DataAccess.Client; using System.Runtime.InteropServices; using System.Text.RegularExpressions; using System.Diagnostics; using System.Data.Common; using System.Collections; namespace DB_Server { #region //操作Oracle數據庫 public class OracleDBService { public OracleDBService(string ConnectionString) { OracleConStr = ConnectionString; } #region//連接數據庫所需變量及方法 private string OracleConStr = ""; private OracleConnection conn;//創建sql連接 private OracleCommand com;//創建sql命令對象 private OracleDataReader dr;//創建sql數據閱讀器 private OracleDataAdapter sdr;//創建sql適配器 private DataSet ds;//創建數據集 /// <summary> /// 創建數據庫連接並打開 /// </summary> public void open() { //創建連接 conn = new OracleConnection(OracleConStr); if (conn.State == ConnectionState.Closed) { conn.Open(); } else if (conn.State == ConnectionState.Broken) { conn.Close(); conn.Open(); } } #region//事務操作數據庫 /// <summary> /// 提交一組(多條)SQL語句操作數據庫 /// </summary> /// <param name="commandStringList">SQL列表</param> /// <returns>執行結果</returns> public int UpdateBatchCommand(ArrayList commandStringList) { open(); OracleTransaction m_OraTrans = conn.BeginTransaction();//創建事務對象 com = new OracleCommand(); com.Connection = conn; string tmpStr = ""; int influenceRowCount = 0; try { foreach (string commandString in commandStringList) { tmpStr = commandString; com.CommandText = tmpStr; influenceRowCount += com.ExecuteNonQuery(); } m_OraTrans.Commit(); return influenceRowCount; } catch (OracleException ex) { m_OraTrans.Rollback(); throw ex; } } #endregion
另外對何時使用事務來操作僅僅有初步認識:對多個表同時進行操作時,其他還有何注意呢?
其他人的觀點:Connection一旦開了一個事務,則執行的命令就必須和事務相關
要注意的是,在事務進行中,不能再對同一個數據庫連接(OracleConnection)再進行事務外的數據的查詢和讀取,if (trans != null) mAdp.SelectCommand.Transaction = trans;
總結:在事務塊內,如果使用同樣的Connection對象查詢,但不指定事務,會報錯,
在事務提交后,或者不使用相同的Connection的對象查詢,不會報錯。