一、事務傳播行爲種類
Spring在TransactionDefinition接口中規定了7種類型的事務傳播行爲,
它們規定了事務方法和事務方法發生嵌套調用時事務如何進行傳播:
事務傳播行爲類型
事務傳播行爲類型 |
說明 |
PROPAGATION_REQUIRED |
如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。 |
PROPAGATION_SUPPORTS |
支持當前事務,如果當前沒有事務,就以非事務方式執行。 |
PROPAGATION_MANDATORY |
使用當前的事務,如果當前沒有事務,就拋出異常。 |
PROPAGATION_REQUIRES_NEW |
新建事務,如果當前存在事務,把當前事務掛起。 |
PROPAGATION_NOT_SUPPORTED |
以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。 |
PROPAGATION_NEVER |
以非事務方式執行,如果當前存在事務,則拋出異常。 |
PROPAGATION_NESTED |
如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類 似的操作。 |
http://xuezhongfeicn.blog.163.com/blog/static/224601412010314239632/
二、Readonly的解釋:
“只讀事務”並不是一個強制選項,它只是一個“暗示”,提示數據庫驅動程序和數據庫系統,這個事務並不包含更改數據的操作,那麼JDBC驅動程序和數據庫就有可能根據這種情況對該事務進行一些特定的優化,比方說不安排相應的數據庫鎖,以減輕事務對數據庫的壓力,畢竟事務也是要消耗數據庫的資源的。
但是你非要在“只讀事務”裏面修改數據,也並非不可以,只不過對於數據一致性的保護不像“讀寫事務”那樣保險而已。
因此,“只讀事務”僅僅是一個性能優化的推薦配置而已,並非強制你要這樣做不可