• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Oraclee事务处理以及在c#中使用oracle的事务处理【转载】

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
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); 
总结:在事务块内,如果使用同样的Connection对象查询,但不指定事务,会报错,            在事务提交后,或者不使用相同的Connection的对象查询,不会报错。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#简单的UDP通信例子发布时间:2022-07-14
下一篇:
c#调用c++带有回调函数方法的实现发布时间:2022-07-14
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap