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的对象查询,不会报错。

posted @ 2013-01-25 13:30  十四  阅读(13134)  评论(0编辑  收藏  举报