JDBC事物回滚怎么不起作用
展开全部
JDBC 事务不回滚?
有两种情况,先看 autoCommit(true),在JDBC规范中有这样一段描述:
Newly created Connection objects are in auto-commit mode by default, which means that individual SQL statements are committed automatically when the statement is completed.
可看出,只要你的SQL 本身没有问题,JDBC就会自动提交,但是比如接入数据发生异常,抛出SQLException的时候事务不会回滚的。
所有通常会手工控制,但是这里还有一个坑,就是有些数据源,会使用代理模式,将真正的Connection 包裹起来(依据架构和组件的不同,可能会有很多层包裹),你需要getMeterConnection 后,在对元Connection设置AutoCommit ,否则无论你怎么写,轻者异常,重者不通知成为“悬案”。
如果你使用了JTA,事务不回滚,依然正常,JTA 不是所有的异常都回滚的,只有对unCheckException 才回滚,换句话说,只有对RuntimeException 或其子异常才回滚。
有两种情况,先看 autoCommit(true),在JDBC规范中有这样一段描述:
Newly created Connection objects are in auto-commit mode by default, which means that individual SQL statements are committed automatically when the statement is completed.
可看出,只要你的SQL 本身没有问题,JDBC就会自动提交,但是比如接入数据发生异常,抛出SQLException的时候事务不会回滚的。
所有通常会手工控制,但是这里还有一个坑,就是有些数据源,会使用代理模式,将真正的Connection 包裹起来(依据架构和组件的不同,可能会有很多层包裹),你需要getMeterConnection 后,在对元Connection设置AutoCommit ,否则无论你怎么写,轻者异常,重者不通知成为“悬案”。
如果你使用了JTA,事务不回滚,依然正常,JTA 不是所有的异常都回滚的,只有对unCheckException 才回滚,换句话说,只有对RuntimeException 或其子异常才回滚。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询