2015-12-10 43 views
0

我正在使用Oracle和AutoCommit ON模式(使用JDBC的Java應用程序)。自動提交開啓時「set transaction」是否啓動事務?

當我執行多個DML語句作爲單個事務,我想我可以做這樣的事情:但是看來,每當我結束了執行rollback,該行具有新值

set transaction read write 
update user_tbl set name='mark' where email='[email protected]' 
update user_tbl set name='ken' where email='[email protected]' 
--if other things are successful, then: 
commit 
-- else: 
--rollback 

給出我上面的陳述。

因此,即使set transaction在開始時執行,是否有可能在AutoCommit ON模式下執行update語句?

回答

0

這在documentaton被清楚地解釋: http://docs.oracle.com/javase/7/docs/api/java/sql/Connection.html
http://docs.oracle.com/javase/7/docs/api/java/sql/Connection.html#setAutoCommit(boolean)

注意:在配置連接,JDBC應用程序應使用適當的連接方法,比如setAutoCommit或setTransactionIsolation。 當存在可用的JDBC方法時,應用程序不應直接調用SQL命令來更改連接的配置。默認情況下,Connection對象處於自動提交模式,這意味着它在執行每個語句後自動提交更改。如果禁用了自動提交模式,則必須顯式調用方法提交以提交更改;否則,數據庫更改將不會保存。


的setAutoCommit
無效的setAutoCommit(布爾自動提交) 拋出的SQLException
將此連接的自動提交模式設置爲給定狀態。 如果連接處於自動提交模式,則其所有SQL語句將作爲單個事務執行並提交。否則,它的SQL語句被分組爲事務,這些事務通過調用方法提交或方法回滾來終止。默認情況下,新連接處於自動提交模式。 聲明完成時發生提交。語句完成的時間取決於SQL語句的類型:

對於DML語句(例如Insert,Update或Delete)和DDL語句,只要語句執行完成,語句就會完成。 對於Select語句,當關聯的結果集關閉時語句完成。 對於CallableStatement對象或返回多個結果的語句,當所有關聯的結果集已關閉並且已檢索到所有更新計數和輸出參數時,該語句完成。 注意:如果在事務期間調用此方法並且自動提交模式發生更改,則事務將被提交。如果調用setAutoCommit並且自動提交模式未更改,則該調用爲空操作。


上述手段,您的代碼,這是在運行自動提交模式,相當於:

set transaction read write; 
commit; -- invoked by JDBC autocommit 
update user_tbl set name='mark' where email='[email protected]'; 
commit; -- invoked by JDBC autocommit 
update user_tbl set name='ken' where email='[email protected]'; 
commit; -- invoked by JDBC autocommit 
--if other things are successful, then: 
commit; 
commit; -- invoked by JDBC autocommit 
相關問題