JDBC Connection.commit()的bug

原创 2004年09月25日 13:13:00

逻辑:
MQ发送->更新Process_code->更新process_code正常->MQ.commit()
                                                   |->更新Process_code异常->MQ.rollback()
程序大概:
MQ.Send();
Connection conn=ConnectionPool.open();
if(conn!=null){
try{
 conn.setAutoCommit(false);
 //Execute SQL Strings on conn
 //更改process_code
 ...
 conn.commit();//
 MQ.commit();
}
catch(SQLException ex){
//conn.rollback
//MQ.rollback();更Process_code失败,mq发送也rollback
...

}
}


一般的情况下这样是没问题的,但如果这个捕获的ex是调用commit()时产生的 "Connection Closed"异常
所执行的SQL语句是否已经生效呢??


这时候程序实际是进入了不确定的状态

Connection.commit()这样的方法逻辑上应该算原子操作,但是它是不可靠的,因为网络是不可靠的,所以永远无法保证数据库操作的commit和jdbc客户端收到这个确认在一个事务里面

不知道这算不算jdbc的一个bug?(虽然这是所有网络程序无法避免的)


=========================================
出问题的原因:

我在用Oracle数据库的时候发现虽然commit抛出"Connection Closed"异常,但所执行的SQL语句(更改Process_code为2)已经生效了,程序处于不确定的状态!这样我就根本无法根据catch到的异常判断做下一步操作(是MQ.rollback,还是MQ.Commit),原来认为出现SQLException就MQ.rollback();结果出现了process_code=2而数据没有发送的情况

=========================================
解决办法:

这个异常是一个随机出现的异常,通过查看日志发现在将近两个月的测试期间仅出现过一次,保守估计此期间数据传输总条数大于40万条,(每条数据传输有多条connection.commit();)

如果出现异常,可以多尝试几次,只要有一次commit成功,程序就可以正确得运转下去,只有当连续几次Connection.commit()出现异常时,程序才会处于不确定得状态,这时认为process_code更新失败,MQ.rollback()

 

jdbc事务处理(commit rollback)

package org.kodejava.example.sql; import java.sql.*; public class TransactionRollbackExample { ...
  • moreorless
  • moreorless
  • 2010年06月07日 15:44
  • 8009

java-JDBC-about AutoCommit[关于Connection的setAutoCommit方法]

setAutoCommit void setAutoCommit(boolean autoCommit) throws SQLException 将此连接的自动提...
  • u013153983
  • u013153983
  • 2017年01月09日 13:29
  • 806

JDBC的autoCommit为true时,其事务管理测试

jdbc autoCommit 存储过程调用
  • LeonWang_Fly
  • LeonWang_Fly
  • 2015年12月04日 18:32
  • 2025

采用JDBC连接池遇到的问题

最近采用多线程使用JDBC连接数据库时,遇到如下问题,当连接次数达到一定次数后,就出现了如下错误提示17:18:14,569 DEBUG BasicResourcePool:1831 - An exc...
  • lysnow_oss
  • lysnow_oss
  • 2007年04月27日 23:42
  • 6088

jdbc事物提交,回滚不起作用的解决方案

今天在写程序的时候发现一个奇怪的问题: 明明设置了事物非自动提交,但是当 回滚后,更新操作还是被执行了,并且不报任何错误. 下面是代码,代码是没有问题的: import java.sq...
  • lidew521
  • lidew521
  • 2016年11月16日 22:48
  • 1719

Connection.setAutoCommit使用的注意事项

Connection.setAutoCommit使用的注意事项 博客分类: java connsqlsetautocommit  Java代码       s...
  • wguoyong
  • wguoyong
  • 2016年05月17日 21:06
  • 1582

Connection.setAutoCommit使用的注意事项

原文地址:http://blog.csdn.net/xiayimiaokuaile/article/details/6422032 setAutoCommit总的来说就是保持数据的完整性,一个...
  • macwhirr123
  • macwhirr123
  • 2015年05月08日 12:36
  • 4202

JDBC Connection.commit()的bug

逻辑:MQ发送->更新Process_code->更新process_code正常->MQ.commit()                                              ...
  • xhni
  • xhni
  • 2004年09月25日 13:13
  • 3031

jdbc操作AutoCommit

import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java...
  • tengdazhang770960436
  • tengdazhang770960436
  • 2011年12月11日 20:06
  • 994

python使用pymysql操作mysql

1.pymysql安装window命令行使用pip安装:pip install pymysql2.mysql写入引入开发包import pymysql.cursors获取数据库连接connection...
  • Gavin_CHEN929
  • Gavin_CHEN929
  • 2016年12月24日 21:28
  • 239
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JDBC Connection.commit()的bug
举报原因:
原因补充:

(最多只允许输入30个字)