问题描述
技术:Java-JDBC ,Weblogic服务器:12c ,数据库:Oracle 12c
我最近将Weblogic服务器从10g迁移到了12c版本。在12c版本上,以下自动提交参数默认情况下设置为true:
autocommet = true autoCommitSpecComplaint = true
因此,即使调用rollback()方法,所有数据库事务也会自动提交。
调试Java代码之后,我注意到在callableStatement.execute()之后立即执行自动提交操作。方法被执行。即自动提交发生在调用rollback()方法之前。并且当执行rollback()方法时,java.sql.sqlException:无法在发生异常时设置自动提交的情况下进行回滚
我在weblogic的“服务器启动”选项卡上设置了以下参数。
-Doracle.jdbc.autoComitSpecCompliant = false -Doracle.jdbc.autocommit = false
但是没有运气。我仍然面对这个问题
我已经阅读了一些建议使用旧版OJDBC驱动程序的文章,但我不想在Weblogic服务器上使用任何旧版驱动程序
我想在Web逻辑服务器本身上覆盖这些参数。所以请帮助我解决此问题
解决方法
如果您希望能够回滚数据库事务,则必须禁用自动提交,否则所有DML查询将立即提交。要禁用自动提交,请确保在服务器启动期间设置了以下属性(这是JVM系统属性):
-Doracle.jdbc.autoCommit = false
(注意大写的C)
如果仍然出现此错误:
java.sql.SQLException:无法在已设置自动提交的情况下提交
或在回滚的情况下
java.sql.SQLException:在启用自动提交的情况下无法回滚
然后您仍处于自动提交模式。
oracle.jdbc.autoCommitSpecCompliant
属性仅应在无法禁用自动提交并且代码仍显式调用commit或rollback时使用(