您的位置:首页 > 数据库

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),设为主键。

存储过程:

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:技术水平有限,原理尚未明白,请大家指教。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: