《Spring事務的陷阱(3)》中的現象與myBatis的執行器參數

    在此前發表的《Spring事務的陷阱(3)》中,該現象僅與myBatis的參數"defaultExecutorType" 有關。若將mybatis.xml中的參數"defaultExecutorType"設爲"BATCH",即:sql

<configuration>
	     <settings>
	          <setting name="defaultExecutorType" value="BATCH"/>
	     </settings>
	 <configuration>

    則如下代碼中的"bookDao.save(book)" 在主鍵衝突時不會立刻拋出異常,而只會在該方法調用結束後、在事務提交前才拋出異常。mybatis

@Transactional
    public void registerBook(Long userId, Book book) {
        try {
            System.out.println(">>Begin...");

            bookDao.save(book);

            System.out.println(">>Success!");

        } catch (Exception e) {
            System.out.println(">>Failed, here catched a exception! ");
        }
    }

    若將myBatis的上述參數"defaultExecutorType"設爲"REUSE"或"SIMPLE",則"bookDao.save(book)" 在主鍵衝突時會當即拋出異常,而後執行進入到catch塊。code

myBatis官方對參數"defaultExecutorType"是這樣說明的:

    有這樣三種執行器, SIMPLE是普通的執行器;REUSE執行器會重用預處理語句(prepared statements);BATCH執行器將重用語句並執行批量更新。xml

那麼應該可理解爲:

  • 設爲"SIMPLE", 在執行bookDao.save(book)時,就至關於JDBC的stmt.execute(sql);
  • 設爲"REUSE", 在執行bookDao.save(book)時,至關於JDBC重用一條sql,再經過stmt傳入多項參數值,而後執行stmt.executeUpdate()或stmt.executeBatch();
  • 設爲"BATCH", 在執行bookDao.save(book)時,至關於JDBC語句的 stmt.addBatch(sql),即僅僅是將執行SQL加入到批量計劃。 因此此時不會拋出主鍵衝突等運行時異常,而只有臨近commit前執行stmt.execteBatch()後纔會拋出異常。
相關文章
相關標籤/搜索