在此前發表的《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
有這樣三種執行器, SIMPLE是普通的執行器;REUSE執行器會重用預處理語句(prepared statements);BATCH執行器將重用語句並執行批量更新。xml