當(dāng)我在數(shù)據(jù)庫更新,插入,刪除等方法中使用了commit(),rollback()等方法時(shí),往往會(huì)報(bào)出如下的異常:
java.sql.SQLException: Can't call commit when autocommit=true
java.sql.SQLException: Can't call commit when autocommit=true等
開始沒弄明白怎么回事,后來解決了
commit() 使自從上一次提交/回滾以來進(jìn)行的所有更改成為持久更改,并釋放此Connection對象當(dāng)前保存的所有數(shù)據(jù)庫鎖定。此方法應(yīng)該只在已禁用自動(dòng)提交模式時(shí)使用。
rollback()取消在當(dāng)前事務(wù)中進(jìn)行的所有更改,并釋放此Connection對象當(dāng)前保存的所有數(shù)據(jù)庫鎖定。此方法應(yīng)該只在已禁用自動(dòng)提交模式時(shí)使用。
如果發(fā)生數(shù)據(jù)庫訪問錯(cuò)誤或者此 Connection 對象處于自動(dòng)提交模式下 ,那么這兩個(gè)方法將會(huì)拋出異常。
解決方法如下
conn = getConnection();
conn.setAutoCommit(false);//在conn = getConnection();后面添加這么一句即可。
void setAutoCommit(boolean autoCommit) throws SQLException
將 此連接的自動(dòng)提交模式設(shè)置為給定狀態(tài)。如果連接處于自動(dòng)提交模式下,則將執(zhí)行其所有 SQL 語句,并將這些語句作為單獨(dú)的事務(wù)提交。否則,其 SQL 語句將成組地進(jìn)入通過調(diào)用 commit 方法或 rollback 方法終止的事務(wù)中。默認(rèn)情況下,新的連接處于自動(dòng)提交模式下。提交發(fā)生在語句完成或執(zhí)行下一條語句時(shí),以先發(fā)生的情況為準(zhǔn)。在語句返回 ResultSet 對象的情況下,該語句在已檢索完最后一行 ResultSet 對象或已關(guān)閉 ResultSet 對象時(shí)完成。在更復(fù)雜的情況下,單個(gè)語句可以返回多個(gè)結(jié)果和輸出參數(shù)值。在這些情況下,提交發(fā)生在檢索到所有結(jié)果和輸出參數(shù)值后。
參數(shù):
autoCommit - 為 true 表示啟用自動(dòng)提交模式;為 false 表示禁用該模式
后來我發(fā)現(xiàn),這個(gè)程序這里根本沒必要用到commit,roolback吧,因?yàn)樗粋€(gè)方法中只執(zhí)行了一個(gè)sql語句,這樣的話,是需要在默認(rèn)的自 動(dòng)提交模式下就夠了,如果方法的實(shí)現(xiàn)有賴于好幾條sql語句,那么commit和roolback就將派上用場了,而對于簡單的添加,刪除,更新,這里似 乎是沒必要用到commit()和roolback().
聯(lián)系客服