两个连接的事务?不知道jta支不支持两阶段提交,我已经很久没有跟踪java技术了?从名词上看应该能够支持的吧。

解决方案 »

  1.   

    大家看我的代码,只有conn1连接处理事务,但在过程中要用到另一个连接(记录集)。事务还是只有一个。
      

  2.   

    我查了一下jta,是j2ee中的东西。
    我现在只是在用jdk1.3.1,怎么用jta?但我不希望用。应该能有办法的。
    请大家帮忙。
      

  3.   

    JTA是最好的选择,如果不这样那只能用你的程序控制了
    先设置两个变量
    boolA=false
    boolB=false
    之后两个事务分开处理
    都不要提交

    try
    {
      Connetion conn1 = DriverManager.getConnection(url,  username,    password);
    conn1.setAutoCommit(false);
    Statement stat1 = conn1.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
    ResultSet rSet1 = stat1.executeQuery(strSql1);
      boolA=true;
    }
    catch(Exception e)

      boolA=false
    }
    try
    {
      Connetion conn2 = DriverManager.getConnection(url,  username,    password);
    conn1.setAutoCommit(false);
    Statement stat2 = conn1.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
    ResultSet rSet2 = stat2.executeQuery(strSql2);
      boolB=true;
    }
    catch(Exception e)

      boolB=false
    }
    try
    {
      if boolA=true and boolB= true
       全部提交
    }
    catch(Exception e)
    {
      全部rollback
    }
      

  4.   

    /*-------------------
    用rSet2更新rSet1,代码略
    --------------------*/
    上面是什么意思?看不明白
      

  5.   

    /*-------------------
    用rSet2更新rSet1,代码略
    --------------------*/
    这一段其实就是对rSet1记录集的操作。和一般的情况一样。
      

  6.   

    难道连这个问题都没人能知道???
    这在VC中是完全可以实现的。jdbc难道这么烂吗?不可能!!!
    叹曰:我太菜
      

  7.   

    我上面说的不可以吗?要有点改动?
    try
    {
      Connetion conn1 = DriverManager.getConnection(url,  username,    password);
    conn1.setAutoCommit(false);
    Statement stat1 = conn1.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
    ResultSet rSet1 = stat1.executeQuery(strSql1);
      boolA=true;
    }
    catch(Exception e)

      boolA=false
    }
    try
    {
      Connetion conn2 = DriverManager.getConnection(url,  username,    password);
    conn1.setAutoCommit(false);
    Statement stat2 = conn1.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
    ResultSet rSet2 = stat2.executeQuery(strSql2);
      boolB=true;
    }
    catch(Exception e)

      boolB=false
    }
    try
    {
      if boolA=true and boolB= true
       全部提交
      else
       全部rollback
    }
    catch(Exception e)
    {
      全部rollback
    }
    你试试,应该可以吧
      

  8.   

    study_body(珍惜每一天) :
    报错:Can't start a cloned connection while in manual transaction mode.
    你的代码中
    Connetion conn2 = DriverManager.getConnection(url,  username,    password);
    conn1.setAutoCommit(false);
    Statement stat2 = conn1.createStatement
    这一段看不懂,为什么不是
    Connetion conn2 = DriverManager.getConnection(url,  username,    password);
    conn2.setAutoCommit(false);
    Statement stat2 = conn2.createStatement
    我试了一下,仍然报resultset not updatable
      

  9.   

    噢那是笔误,我只是提供一种思想,但是我发现我的这种做法也可能导致问题
    就是在try
    {
      if boolA=true and boolB= true
       全部提交
      else
       全部rollback
    }
    这里
    如果第一个事务提交成功而另一个没有成功则起不到事务的作用,另外你先实验一下只用一个事务就是先对一个数据库操作看是否可以再说!
      

  10.   

    这和对几个数据库操作有什么关系啊??不过我只对一个数据库操作,呵呵。
    一个连接一个事务是可以的,但两个连接一个事务就不行了。用两个连接是为了得到两个记录集,其中只对一个记录集进行update。
      

  11.   

    我就是对一个库进行操作,比如说有两张表tbl1,tbl2,两张表的结构一样,我想用tbl2的数据更新tbl1的数据,所以在程序里要得到两个记录集,然后遍历两个记录集进行更新,这个更新过程当然需要在一个事务中完成,这时候,错误就出现了,请大家不要提用一个sql语句、存储过程、触发器等的建议,这么做是由实际的需要造成的。
    在VC中这种方法是很容易实现的啊,在java中怎么用呢??
      

  12.   

    将Connetion conn2 = DriverManager.getConnection(url,  username,  password);删除,conn2 全部更改成为conn1。
      

  13.   

    这样做我这里会报错:
    Can't start a cloned connection while in manual transaction mode.
    你能在机器上试试吗?
      

  14.   

    Connetion conn1 = DriverManager.getConnection(url,  username,  password);
    Connetion conn2 = DriverManager.getConnection(url,  username,  password);
    conn1.setAutoCommit(false);
    Statement stat1 = conn1.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
    ResultSet rSet1 = stat1.executeQuery(strSql1);Statement stat2 = conn2.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
    ResultSet rSet2 = stat2.executeQuery(strSql2);
    /*-------------------
    用rSet2更新rSet1,代码略
    --------------------*/conn1.commit();
    conn1.setAutoCommit(true);
    改成
    Connetion conn1 = DriverManager.getConnection(url,  username,  password);
    conn1.setAutoCommit(false);
    Statement stat1 = conn1.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
    ResultSet rSet1 = stat1.executeQuery(strSql1);Statement stat2 = conn1.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
    ResultSet rSet2 = stat2.executeQuery(strSql2);
    /*-------------------
    用rSet2更新rSet1,代码略
    --------------------*/conn1.commit();
    conn1.setAutoCommit(true);
    就不会有问题,只有一个Connection对象,哪里来的克隆
      

  15.   

    study_body(珍惜每一天):
    呵呵,首先我很感谢你,你太有耐心了,这一百分我就先给你了。但是问题还在继续,代码和你的相同,错误依旧。
    我觉得,当一个connection建立多个statement的时候,都是在复用一个连接,但这个连接是拷贝生成的。在查这个问题的时候,我发现了另外一个问题,请帮助,分另给(其实分多少本身没有意义,仅表示我的感激之情)。
    建立一个可修改的记录集时(如下),
    Statement stat1 = conn1.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
    ResultSet rSet1 = stat1.executeQuery(strSql1);
    在jbuilder环境里是可以运行通过的,但是我在jbuilder外启动tomcat,然后运行(不在jbuilder环境下)该程序,就会报错:
    java.sql.SQLException:[Microsoft][SQLServer 2000 Driver for JDBC]Error setting up static cursor cache.
    这是什么造成的?
    记录集改成只读的不会报此错误。
      

  16.   

    今天没有时间了,以后帮你查查,好象应用程序没有问题而servlet有这个问题?
      

  17.   

    我一直等着你呢,呵呵,我这段程序是放在servlet中的
      

  18.   

    "我觉得,当一个connection建立多个statement的时候,都是在复用一个连接,但这个连接是拷贝生成的。"没必要拷贝啊!用的都是同一个引用!
    我觉得study_body的代码没问题啊!tomcat里面的jdbc是多少版本的?jdbc1.0不支持可修改的记录集
      

  19.   

    这个问题都没人能指点我???????????????
    faint
      

  20.   

    唉,真失望,我知道这些错和代码没关系,好像用支持jta的jdbc driver就没问题。
    就这样啊,
    多谢 study_body(珍惜每一天)