C#使用事務操作ORACLE數據庫


關於使用事務有幾點不太明確:

   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的對象查詢,不會報錯。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM