在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
1、 savepoint(建立保存点,用于失误时回滚到保存点)
建立保存点a1:savepoint a1; ............................[其间干了很多事] 再建立保存点a2:savepoint a2; ............................[又再干了很多事] 回滚到a2保存点:rollback to a2; 回滚到a1保存点:rollback to a1; 如果不指定保存点即为取消全部事务,如:rollback; 注意:如果建立保存点后执行过:commit语句,则为提出交事务,确认事务变化、结束事务、删除所有保存点、释放锁。 当使用commit语句结束事务后,其它会话将可以查看到事务变化后的新数据。
2、只读事务:transaction read only 一旦设定了只读事务(一般数据库管理员设定) ,则其它人提交上来的动作都不会看到。 如管理员操作:set transaction read only; A用户操作增删改:。。。。。。(自已进行查询时可以看到所影响的数据) B用户查询时:。。。。。。。。(看不到A用户进行过操作所影响的数据) 修改事务为读写的命令为:SET TRANSACTION READ WRITE;
3、在C#代码中使用Oracle的数据库事务 OracleTransaction类的概述 应用程序通过针对OracleConnection对象调用 BeginTransaction 来创建OracleTransaction对象。对OracleTransaction对象执行与该事务关联的所有后续操作(例如提交或中止该事务)。 OracleTransaction的成员主要有: 属性: Connection,指定与该事务关联的OracleConnection对象; IsolationLevel,指定该事务的IsolationLevel; 枚举类型,用于对事物的锁定,取值有Chaos、ReadCommited、ReadUncommited、RepeatableRead、Serializable、Unspecified。 方法: Commit,提交SQL数据库事务; Rollback , 从挂起状态回滚事务; public void 函数名称() { string strUpdateSql1 = "update 表名 set XH='...' where XH='...' and LCGZ_ID='...'; string strUpdateSql2 = "update 表名 set XH='...' where BZGZ_ID='...'; OracleConnection conn = new OracleConnection(); conn.ConnectionString = "数据库连接字符串"; conn.Open(); OracleTransaction updateProcess = conn.BeginTransaction(); try { OracleCommand comm1 = conn.CreateCommand(); comm1.CommandText = strUpdateSql1; comm1.Transaction = updateProcess; comm1.ExecuteNonQuery(); OracleCommand comm2 = conn.CreateCommand(); comm2.CommandText = strUpdateSql2; comm2.Transaction = updateProcess; comm2.ExecuteNonQuery(); updateProcess.Commit(); } catch() { updateProcess.Rollback(); } finally { conn.Close(); } } 第二个示例: public static bool 函数名2(int fID) { OracleConnection conn = new OracleConnection(); conn.ConnectionString = "数据库连接字符串"; conn.Open(); OracleTransaction deleteProcess = conn.BeginTransaction(); try { ArrayList alObjects = GetObjects(); foreach(object o in alObjects) { OracleCommand tmpComm = conn.CreateCommand(); tmpComm.Transaction = deleteProcess; tmpComm.CommandText = "delete from 表1名 where BZGZ_ID="+o.ID; tmpComm.ExecuteNonQuery(); OracleCommand tmpComm2 = conn.CreateCommand(); tmpComm2.Transaction = deleteProcess; tmpComm2.CommandText = "delete from 表2名 where BZGZ_ID="+o.ID; tmpComm2.ExecuteNonQuery(); } OracleCommand comm = conn.CreateCommand(); comm.Transaction = deleteProcess; comm.CommandText = "delete from 表3名 where LCGZ_ID="+fID; comm.ExecuteNonQuery(); deleteProcess.Commit(); return true; } catch() { deleteProcess.Rollback(); return false; } finally { conn.Close(); } ========================================================================= Connection一旦开了一个事务,则执行的命令就必须和事务相关 要注意的是,在事务进行中,不能再对同一个数据库连接(OracleConnection)再进行事务外的数据的查询和读取, 也就是说,类似下边的语句是不能执行的: OracleDataAdapter mAdp = new OracleDataAdapter(sSql, mCon); DataTable mDst = new DataTable(); mAdp.Fill(mDst); 而是得加一条语句,在事务内进行查询: OracleDataAdapter mAdp = new OracleDataAdapter(sSql, mCon); if (trans != null) mAdp.SelectCommand.Transaction = trans; DataTable mDst = new DataTable(); mAdp.Fill(mDst); |
请发表评论