2016-03-06 45 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

相關問題