關於使用事務有幾點不太明確:
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的對象查詢,不會報錯。
