土成
2017-02-03 07:16
采纳率: 83.3%
浏览 14.8k
已采纳

java中事务未提交,但是在update之后再select为什么会得到update之后的结果?

想知道为什么会这样?
代码如下:


public static void main(String[] args) {
        String dbName = "F:/firstdb";

        String driver = "org.apache.derby.jdbc.EmbeddedDriver";

        String protocol = "jdbc:derby:";

        try{
            Class.forName(driver).newInstance();
            System.out.println("Loaded the appropriate driver");

            Connection conn = DriverManager.getConnection(protocol + dbName + ";");
            System.out.println("Connected to and created database " + dbName);

            conn.setAutoCommit(false);
            Statement stat = conn.createStatement();
            String command = "update my_test set NAME='1234' where ID='03'";
            stat.executeUpdate(command);
            //conn.rollback();


            PreparedStatement state = conn.prepareStatement("select * from my_test", ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

            ResultSet rs = state.executeQuery();

            int i = 1;
            while(rs.next()){
                if(i < 4){
                    System.out.printf(rs.getString(1) + " ");
                    System.out.printf(rs.getString(2) + " ");
                    System.out.printf(rs.getString(3) + " ");
                    System.out.printf(rs.getString(4) + "\n");
                    i++;
                }else{
                    rs.relative(-2);
                    System.out.println("finally");
                    System.out.printf(rs.getString(1) + " ");
                    System.out.printf(rs.getString(2) + " ");
                    System.out.printf(rs.getString(3) + " ");
                    System.out.printf(rs.getString(4) + "\n");
                    break;
                }
            }

        }catch(Exception e){
            e.printStackTrace();
        }
    }

结果如下:

 Loaded the appropriate driver
Connected to and created database F:/firstdb
01 男 10 LiSi
02 女 20 ZhangSan
03 男 40 1234
finally
02 女 20 ZhangSan

如果把update相关语句注释掉,那么结果如下:

 Loaded the appropriate driver
Connected to and created database F:/firstdb
01 男 10 LiSi
02 女 20 ZhangSan
03 男 40 123
finally
02 女 20 ZhangSan
  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

8条回答 默认 最新

  • AProMonkey 2017-02-03 09:17
    已采纳

    你这是没有明白什么叫事务,在数据库事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行,这是一种机制,用以维护数据库的完整性。在你这个事务单元中存在两个操作,一个是update,一个是select;你前面的update执行成功了,再执行select肯定能够查询到前面update的数据,因为你是在一个单元中。但是另外一个事务(即另一个单元)则不能select到这个update的数据,因为你update的数据还没提交,只在该单元中有效

    已采纳该答案
    评论
    解决 19 无用
    打赏 举报
  • 半杯凉月 2017-02-03 08:27

    你这是在同一个事务中进行的操作,虽然没有存入数据库,然是更改和查询的数据是同一条,每次执行完一次后应该关闭连接

    评论
    解决 无用
    打赏 举报
  • panpan_chen 2017-02-03 09:08

    事务是隔离不同事务操作对同一数据的读写,你可以了解下事务的四个特性

    评论
    解决 无用
    打赏 举报
  • Melody4Java 2017-02-03 10:06

    就像楼上说的,事务的隔离性指的是两个事物之间。在同一事务中不存在隔离

    评论
    解决 无用
    打赏 举报
  • roc_tootwo 2017-02-03 13:04

    你的update和select是处于同一个事务当中

    评论
    解决 无用
    打赏 举报
  • 我爱大遵义 2017-02-04 07:41

    而是她的衣服估计

    评论
    解决 无用
    打赏 举报
  • 编程爱好者熊浪 2017-02-06 16:01

    conn.setAutoCommit(false);你设置了手动提交事务,必须要有跟他配对的commit或者是rollback,否则在这个连接既conn关闭之前,所有格update,insert,delete都是无效的,如果你把上面的conn.setAutoCommit(false);注释掉,效果就是修改了的。

    评论
    解决 无用
    打赏 举报
  • 慕容囧囧 2019-05-01 08:16

    conn.setAutoCommit(false);这句话表示手动提交事务,你的update语句和select语句是在同一个事务中,所以,尽管你把conn.rollback();回滚的这句话注释掉了,update语句和select还是处于同一个事务中,所以update做的修改,select是可以看到update修改后的结果的,你可以这样测试一下,打开你的PLSQL Developer软件工具,在该软件工具中写上如下语句update my_test set NAME='1234' where ID='03';select * from my_test;然后执行,然后你看到的就是查询是修改后的效果,尽管你对这2句话,没有提交也没有回滚。
    但是,我们可以接着测试,你可以打开一个新的PLSQL Developer软件窗口,在新窗口中输入select * from my_test;执行该语句的话,查询到的就是update更新前的数据,因为你新打开一个PLSQL Developer软件工具,就意味着这是一个新的连接,即这是一个新的会话,即这是一个新的事务,事务的隔离指的是不同事务之间的隔离,而不是指同一个事务内的隔离,同一个事务内压根不存在隔离的说法

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题