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的对象查询,不会报错。
本文来自博客园,作者:十四,转载请注明原文链接:https://www.cnblogs.com/yanghucheng/archive/2013/01/25/2876492.html