JDBC事务和数据库事务嵌套的讨论
2009-03-20 01:09
211 查看
首先必须执行con.setAutoCommit(false)方法,将JDBC事务设置为手动提交,否则手动提交con.commit()无效,手动回滚con.rollback()引发SQLException:AutoCommit 模式设置为“true”时,无法调用回滚操作。
我们执行con.setAutoCommit(false)方法,将JDBC事务设置为手动提交,然后分9种情况讨论JDBC事务和数据库事务。
表:user,只有一个字段userName varchar(50),设为主键。
存储过程:
测试类
描述:存储过程里面有一条INSERT语句在数据库事务管理下,而另一条INSERT语句在JDBC事务管理下,假定我们现在执行的语句均不违反约束。
情况一:JDBC事务和数据库事务都既不提交也不回滚
结果:未出现任何异常,但语句也并未提交。
情况二:JDBC事务既不提交也不回滚,数据库事务提交
结果:未出现任何异常,但两条语句均未提交。
情况三:JDBC事务既不提交也不回滚,数据库事务回滚
结果:未出现任何异常,但两条语句均未提交。
情况四:JDBC事务和数据库事务都回滚
结果:在执行con.rollback()的时候出现SQLException:服务器无法继续执行该事务,说明: 3600000001。当然,两条语句均未成功。
情况五:JDBC事务回滚,数据库事务提交
结果:虽然数据库事务提交,但是两条语句均未成功,JDBC事务的回滚影响到了数据库事务。
情况六:JDBC事务回滚,数据库事务既不提交也不回滚
结果:未出现任何异常,但两条语句均未提交。
情况七:JDBC事务提交,数据库事务回滚
结果:在执行con.rollback()的时候出现SQLException:服务器无法继续执行该事务,说明: 3600000001。当然,两条语句均未成功。
情况八:JDBC事务和数据库事务都提交
结果:执行一切顺利,两条语句都正确执行。
情况九:JDBC事务提交,数据库事务既不提交也不回滚
结果:未出现任何异常,但两条语句均未提交。
总结:成功提交的情况只有一种——JDBC事务和数据库事务都提交;若数据库事务提交或回滚,则con.commit()失效,而con.rollback()则会报异常。
推荐配置:若JDBC事务和数据库事务同时存在,数据库事务把提交和回滚的情况配完整,而JDBC事务只需执行con.commit()方法,它会根据数据库事务的情况自动判断是否真正提交。
PS:技术水平有限,原理尚未明白,请大家指教。
我们执行con.setAutoCommit(false)方法,将JDBC事务设置为手动提交,然后分9种情况讨论JDBC事务和数据库事务。
表:user,只有一个字段userName varchar(50),设为主键。
存储过程:
CREATE PROCEDURE insertUser @userName VARCHAR(50) AS BEGIN TRANSACTION INSERT INTO [user](userName) VALUES (@userName) COMMIT TRANSACTION INSERT INTO [user](userName) VALUES ('accp') GO
测试类
public class TransactionTest { public void testTransaction() { Connection con = null; CallableStatement cst = null; try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); con = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DataBaseName=testDB", "sa", "123456"); con.setAutoCommit(false);// 将JDBC事务设置为手动提交 cst = con.prepareCall("{call insertUser(?)}"); cst.setString(1, "admin"); cst.execute(); con.commit();// 回滚执行con.rollback(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (cst != null) { cst.close(); } if (con != null) { con.close(); } } catch (SQLException e) { e.printStackTrace(); } } } }
描述:存储过程里面有一条INSERT语句在数据库事务管理下,而另一条INSERT语句在JDBC事务管理下,假定我们现在执行的语句均不违反约束。
情况一:JDBC事务和数据库事务都既不提交也不回滚
结果:未出现任何异常,但语句也并未提交。
情况二:JDBC事务既不提交也不回滚,数据库事务提交
结果:未出现任何异常,但两条语句均未提交。
情况三:JDBC事务既不提交也不回滚,数据库事务回滚
结果:未出现任何异常,但两条语句均未提交。
情况四:JDBC事务和数据库事务都回滚
结果:在执行con.rollback()的时候出现SQLException:服务器无法继续执行该事务,说明: 3600000001。当然,两条语句均未成功。
情况五:JDBC事务回滚,数据库事务提交
结果:虽然数据库事务提交,但是两条语句均未成功,JDBC事务的回滚影响到了数据库事务。
情况六:JDBC事务回滚,数据库事务既不提交也不回滚
结果:未出现任何异常,但两条语句均未提交。
情况七:JDBC事务提交,数据库事务回滚
结果:在执行con.rollback()的时候出现SQLException:服务器无法继续执行该事务,说明: 3600000001。当然,两条语句均未成功。
情况八:JDBC事务和数据库事务都提交
结果:执行一切顺利,两条语句都正确执行。
情况九:JDBC事务提交,数据库事务既不提交也不回滚
结果:未出现任何异常,但两条语句均未提交。
总结:成功提交的情况只有一种——JDBC事务和数据库事务都提交;若数据库事务提交或回滚,则con.commit()失效,而con.rollback()则会报异常。
推荐配置:若JDBC事务和数据库事务同时存在,数据库事务把提交和回滚的情况配完整,而JDBC事务只需执行con.commit()方法,它会根据数据库事务的情况自动判断是否真正提交。
PS:技术水平有限,原理尚未明白,请大家指教。
相关文章推荐
- JDBC事务和数据库事务嵌套的讨论 .
- JDBC事务和数据库事务嵌套的讨论
- JDBC的数据库事务
- Spring 事务操作(银行转账案例),使用spring 对jdbc的支持完成对数据库的操作
- java_web学习第十天(JDBC数据库驱动----分页、事务)
- MySQL嵌套事务的讨论
- 尽管关于Java中文问题的讨论已经相当多了,但由于Java的相关技术标准繁多,面向Java的Web服务器、应用服务器以及JDBC数据库驱动等都没有官方的标准,所以Java应用在处理中文时所存在的问
- java JDBC 数据库 事务 ACID
- 使用JDBC进行数据库的事务操作(2)
- 数据库中间件 Sharding-JDBC 源码分析 —— 事务(一)之BED
- Spring事务之二(JDBC连接数据库的四种方式)
- JDBC:数据库操作:事务
- 数据库事务简介及JDBC使用事务
- JSP 部属Tomcat jsp嵌套Java代码 通过JDBC获取数据库表通过Java在JSP页面输出
- 基于跨数据库的事务的一个讨论,希望参考下大家的意见
- JDBC对数据库的事务操作(转)
- 关于事务开启与否对数据库插入数据所需时间的影响的讨论
- MSSQL数据库嵌套存储过程的事务控制
- JDBC-数据库事务回滚
- spring 中 Hibernate 事务和JDBC事务嵌套问题