问题的起点 1,接手深圳地税银税扣款接口 2,发现扣款业务数据操作流程中,事务控制存在问题
过程: 1,在看了jdk142doc和spring、hibernate api-doc后,发现在doc里面,就已经提及,doc只约定了应该要保证batchupdate,但是具体依赖于不同DB的jdbc驱动 2,不同的jdbc驱动处理batchupdate可能有几种情况 a,完整按照jdbc规范 b,按照自己实现,但是支持有限,如oracle 3,在batchupdate处理失败的情况下, a,记录此DML操作失败,继续提交数据操作,返回结果数组 b,停止数据操作,或者回滚,或者不回滚
从目前的情况初步分析来看,是碰到3-b中不回滚情况
在紧接着的检查中发现2点需要记忆的东西: 1,PreparedStatement.executeBatch 如果此前它所在的connection已经执行过一个PreparedStatement,则第2次开始就无效 updateCount=0 需要调用executeUpdate
2,DB2的事务声明 解决方案,把 auto-commit 设置为false 。(如连接池里设置)
或 :
Properties properties = new Properties (); properties.put ("transaction isolation", "none"); try { Class.forName("com.ibm.db2.jdbc.app.DB2Driver") connection = DriverManager.getConnection("jdbc:db2://RCHASSC2", properties);
开源框架好是好,很多技术都定义了规范,将实现交给具体实现者。但我认为,这就增加了使用、集成者的工作难度,需要考虑实现特点。