簡體   English   中英

Java JDBC batchExecute插入

[英]Java JDBC batchExecute insert

我將JDBC addBatch和batchExecute用於插入語句。 我已啟用自動提交模式。 我的問題是,例如,當我有20個插入,而插入編號10引發異常(例如,不允許使用空值)時,則不會插入任何數據。 不應該插入前10個ok語句嗎?

我的代碼:

        try {
            int[] results =  stmt.executeBatch();                
            return results;
        } catch (BatchUpdateException e) {
            int[] tmpres = e.getUpdateCounts();                
            for (i = 0; i < tmpres.length; i++) {
                System.out.println(tmpres[i]);
            }
        }

我在輸出中看到前10條語句的更新計數為1。那么為什么不插入數據呢?

最好的問候,彼得

至少在一般情況下,這個問題的其他答案有些誤導。

在大多數情況下,將executeBatch()setAutoCommit(true)

  • 批處理中的語句包裝在隱式事務中,並且
  • 在BatchUpdateException之前處理的語句被提交。

對於MySQL Connector / J(默認rewriteBatchedStatements=false ),Microsoft SQL Server JDBC驅動程序,Derby和HSQLDB,絕對是正確的。 (我只是運行實際的Java代碼進行確認。)

與JDBC的許多其他方面一樣, 您的特定情況下的實際行為取決於您所使用的JDBC驅動程序的特定實現。

似乎在您的配置中,實際上一批內的所有語句都在一個事務中執行。 因此,如果任何插入失敗,整個事務(即整個批次)將被回滾。 即使啟用了自動提交。

在這種情況下, 所有語句都包含在同一事務中,因此任何會導致錯誤的語句都會回滾整個事務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM