2016-03-06 60 views
0

我在JDBC连接中使用事务有个问题。
我知道如何使用setAutoCommit(),roolback()和commit()。
但现在,我读了,还可以在SQL脚本中使用这些命令:JDBC事务和sql脚本命令之间的区别

begin transaction; 
create table table1(); 
create table table2(); 
commit; 

的区别是什么?如果将JDBC连接的自动提交模式设置为false,然后运行sql脚本,会发生什么情况?交易命令是否仅具有暂时效果,或者命令是否被忽略?

回答

0

有什么区别?

运行JDBC代码如commit()rollback()是简单地围绕原始SQL(即SQL脚本)一个Java包装。如果您从JDBC连接调用commit(),则最终将在SQL中调用commit命令。

如果我将JDBC连接的自动提交模式设置为false,然后运行sql脚本,会发生什么?

如果您将JDBC连接的自动提交模式设置为false,那么您只为该特定连接的作用域设置了自动提交false。如果您有不同的连接并调用SQL脚本,或者甚至打开另一个JDBC连接,则连接将拥有自己的自动提交模式。

交易命令是否仅具有暂时效果,或者命令是否被忽略?

如果您正在使用auto-commit = false,那么在您提交事务之前,数据库不会发生永久性事件。如果您使用auto-commit = true进行操作,那么每次执行命令后都会发生提交。

0

如果你想在你的应用程序中使用的交易,通常会设置autoCommitFALSE你明确地发出COMMITROLLBACK

因此,您问题中的脚本将在一个事务中创建两个表,即两者都不是。

有两点需要注意到你的脚本:

一些数据库系统(如Oracle)也含蓄地打开事务(没有begin transaction

一些database systems(如Oracle,MySQL等)做隐含COMMITcreate table声明,所以最后的COMMIT将不起作用,并且在那些RDBMS中可以只创建一个表结束。

+0

首先 - 感谢您的回答。抱歉 - 这是我的错误。我的意思是,如果将自动提交模式设置为TRUE(我只有一个JDBC连接),然后使用上面的事务命令运行sql脚本,会发生什么情况?比方说,第一个create-statement被成功执行,第二个语句失败 - 事务现在是回滚还是第一个表已经存在,因为auto-commit = true?作为数据库类型,我正在使用SQLite。 – altralaser