眾所周知的ACID屬性:
原子性(atomicity)、一致性(consistency)、隔離性(isolation)以及持久性(durability)。我們無法控制一致性、原子性以及持久性,但可以控制超時,設置事務的只讀性以指定隔離級別。
Spring在TransactionDefinition接口封裝了所有這些設置。
Spring在TransactionDefinition接口中規定了7種類型的事務傳播行為,
它們規定了事務方法和事務方法發生嵌套調用時事務如何進行傳播:
事務傳播行為類型
事務傳播行為類型 |
說明 |
PROPAGATION_REQUIRED |
如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。 |
PROPAGATION_SUPPORTS |
支持當前事務,如果當前沒有事務,就以非事務方式執行。 |
PROPAGATION_MANDATORY |
使用當前的事務,如果當前沒有事務,就拋出異常。 |
PROPAGATION_REQUIRES_NEW |
新建事務,如果當前存在事務,把當前事務掛起。 |
PROPAGATION_NOT_SUPPORTED |
以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。 |
PROPAGATION_NEVER |
以非事務方式執行,如果當前存在事務,則拋出異常。 |
PROPAGATION_NESTED |
如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類 似的操作。 |
spring 事務注解 默認遇到throw new RuntimeException("...");會回滾 需要捕獲的throw new Exception("...");不會回滾 // 指定回滾 @Transactional(rollbackFor=Exception.class) public void methodName() { // 不會回滾 throw new Exception("..."); } //指定不回滾 @Transactional(noRollbackFor=Exception.class) public ItimDaoImpl getItemDaoImpl() { // 會回滾 throw new RuntimeException("注釋"); } // 如果有事務,那么加入事務,沒有的話新建一個(不寫的情況下) @Transactional(propagation=Propagation.REQUIRED) // 容器不為這個方法開啟事務 @Transactional(propagation=Propagation.NOT_SUPPORTED) // 不管是否存在事務,都創建一個新的事務,原來的掛起,新的執行完畢,繼續執行老的事務 @Transactional(propagation=Propagation.REQUIRES_NEW) // 必須在一個已有的事務中執行,否則拋出異常 @Transactional(propagation=Propagation.MANDATORY) // 必須在一個沒有的事務中執行,否則拋出異常(與Propagation.MANDATORY相反) @Transactional(propagation=Propagation.NEVER) // 如果其他bean調用這個方法,在其他bean中聲明事務,那就用事務.如果其他bean沒有聲明事務,那就不用事務. @Transactional(propagation=Propagation.SUPPORTS) /* public void methodName(){ // 本類的修改方法 1 update(); // 調用其他類的修改方法 otherBean.update(); // 本類的修改方法 2 update(); } other失敗了不會影響 本類的修改提交成功 本類update的失敗,other也失敗 */ @Transactional(propagation=Propagation.NESTED) // readOnly=true只讀,能插入,但不能更新,刪除 @Transactional (propagation = Propagation.REQUIRED,readOnly=true) // 設置超時時間 @Transactional (propagation = Propagation.REQUIRED,timeout=30) // 設置數據庫隔離級別 @Transactional (propagation = Propagation.REQUIRED,isolation=Isolation.DEFAULT)
事務隔離級別:
隔離級別 說明
ISOLATION_DEFAULT 默認級別(對大多數數據庫來說就是ISOLATION_READ_COMMITTED)
ISOLATION_READ_UNCOMMITTED 最低的隔離級別。事實上我們不應該隔離級別,因為在事務完成前,其他事務可以看到該事務所修改的數據。而在其他事務提交前,該事務也可以看到其他事務所做的修改。
ISOLATION_READ_COMMITTED 大多數數據庫的默認級別。在事務完成前,其他事務無法看到該事務所修改的數據。遺憾的是,在該事務提交后,你就可以查看其他事務插入活更新的數據。這意味 着在事務的不同點上,如果其他事務修改數據,你會看到不同的數據。
ISOLATION_REPEATABLE_READ 該隔離級別確保如果在事務中查詢了某個數據集,你至少還能再次查詢到相同的數據集,即使其他事務修改了所查詢的數據。然而如果其他事務插入了新數據,你就可以查詢到該新插入的數據。
ISOLATION_SERIALIZABLE 代價最大、可靠性最高的隔離級別,所有的事務都是俺順序一個接一個的執行。