一 事務特性
原子性 (atomicity):強調事務的不可分割.
一致性 (consistency):事務的執行的前後數據的完整性保持一致.
隔離性 (isolation):一個事務執行的過程中,不應該受到其他事務的干擾
持久性(durability) :事務一旦結束,數據就持久到數據庫
如果不考慮隔離性引發安全性問題:
髒讀 :一個事務讀到了另一個事務的未提交的數據
不可重複讀 :一個事務讀到了另一個事務已經提交的 update 的數據導致多次查詢結果不一致.
虛幻讀 :一個事務讀到了另一個事務已經提交的 insert 的數據導致多次查詢結果不一致.
解決讀問題: 設置事務隔離級別(5種)
DEFAULT 這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別.
未提交讀(read uncommited) :髒讀,不可重複讀,虛讀都有可能發生
已提交讀 (read commited):避免髒讀。但是不可重複讀和虛讀有可能發生
可重複讀 (repeatable read) :避免髒讀和不可重複讀.但是虛讀有可能發生.
串行化的 (serializable) :避免以上所有讀問題.
Mysql 默認:可重複讀
Oracle 默認:讀已提交
二 事務隔離
ISOLATION_DEFAULT
這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別.-可重複讀
ISOLATION_READ_UNCOMMITTED
這是事務最低的隔離級別,它充許別外一個事務可以看到這個事務未提交的數據。
這種隔離級別會產生髒讀,不可重複讀和幻像讀。
ISOLATION_READ_COMMITTED
保證一個事務修改的數據提交後才能被另外一個事務讀取。另外一個事務不能讀取該事務未提交的數據。
這種事務隔離級別可以避免髒讀出現,但是可能會出現不可重複讀和幻像讀。
ISOLATION_REPEATABLE_READ
這種事務隔離級別可以防止髒讀,不可重複讀。但是可能出現幻像讀。
它除了保證一個事務不能讀取另一個事務未提交的數據外,還保證了避免下面的情況產生(不可重複讀)。
ISOLATION_SERIALIZABLE
這是花費最高代價但是最可靠的事務隔離級別。事務被處理爲順序執行。
除了防止髒讀,不可重複讀外,還避免了幻像讀。
三 事務傳播行爲
1保證同一個事務中
PROPAGATION_REQUIRED 支持當前事務,如果不存在 就新建一個(默認)
PROPAGATION_SUPPORTS 支持當前事務,如果不存在,就不使用事務
PROPAGATION_MANDATORY 支持當前事務,如果不存在,拋出異常
2 保證沒有在同一個事務中
PROPAGATION_REQUIRES_NEW 如果有事務存在,掛起當前事務,創建一個新的事務
PROPAGATION_NOT_SUPPORTED 以非事務方式運行,如果有事務存在,掛起當前事務
PROPAGATION_NEVER 以非事務方式運行,如果有事務存在,拋出異常
PROPAGATION_NESTED 如果當前事務存在,則嵌套事務執行
四 事務執行機制
1 spring對事物的執行是通過切面進行攔截的,其底層是動態代理的原理,所以如果調用一個沒有被代理的方法,那麼這裏面的方法的
事物相關都是失效的,這點要特別注意,那麼如果非要在一個類裏面調用一個方法,可以通過以下幾種方式實現對該方法的代理
1 使用AopContext實現轉換爲代理對象的方法
((Service) AopContext.currentProxy()).callMethodB();
2 使用ApplicationContext獲取當前要被代理的對象
ApplicationContext.getBean(Service.class).callMethodB();