zoukankan      html  css  js  c++  java
  • Oraclee 事务处理以及在c#中使用oracle的事务处理【转载】

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

  • 相关阅读:
    使用 GPUOperator 与 KubeSphere 简化深度学习训练与 GPU 监控
    基于 WeDataSphere Prophecis 与 KubeSphere 构建云原生机器学习平台
    在 Kubernetes Pod 中如何获取客户端的真实 IP
    云原生的 WebAssembly 能取代 Docker 吗?
    KubeSphere 开源 KubeEye:Kubernetes 集群自动巡检工具
    对于 Serverless, DevOps, 多云及边缘可观察性的思考与实践
    终于可以像使用 Docker 一样丝滑地使用 Containerd 了
    你真的理解 Kubernetes 中的 requests 和 limits 吗?
    顶点(vertexs) 图元(primitives) 片元(fragments片断) 像素(pixels)
    GLUT回调函数
  • 原文地址:https://www.cnblogs.com/happylyyer/p/4344882.html
Copyright © 2011-2022 走看看