事務的併發問題
事務的併發問題 | 含義 | 產生原因 |
---|---|---|
髒讀 | 一個事務讀取到另一個事務未提交的數據 | 另一個事務執行了操作,但還未提交 |
不可重複讀 | 一個事務因讀取到另一個事務已提交的數據。導致對同一條記錄讀取兩次以上的結果不一致 | 另一個事務發生update操作 |
幻讀 | 一個事務因讀取到另一個事務已提交的數據。導致對同一張表讀取兩次以上的結果不一致 | 另一個事務發生insert,delete操作 |
事務隔離級別
事務隔離級別 | 含義 |
---|---|
Read uncommitted (讀未提交) | 最低級別,任何情況都無法保證 |
Read committed (讀已提交) | 避免髒讀 |
Repeatable read (可重複讀) | 避免髒讀,不可重複讀 |
Serializable (串行化) | 可避免髒讀,不可重複讀,幻讀 |
spring事務管理
Spring並不直接管理事務,而是提供了多種事務管理器,他們將事務管理的職責委託給Hibernate或者JTA等持久化機制所提供的相關平臺框架的事務來實現。 Spring事務管理器的接口是PlatformTransactionManager,通過這個接口,Spring爲各個平臺如JDBC、Hibernate等都提供了對應的事務管理器,但是具體的實現就是各個平臺自己的事情了。
PlatformTransactionManager接口: 平臺事務管理器.(真正管理事務的類)。該接口有具體的實現類,根據不同的持久層框架,需要選擇不同的實現類;
TransactionDefinition接口: 事務定義信息(事務的隔離級別,傳播行爲,超時,只讀);
TransactionStatus接口: 事務的狀態(是否新事務、是否已提交、是否有保存點、是否回滾)
PlatformTransactionManager接口的實現類:
DataSourceTransactionManager: Spring的JDBC模板或者MyBatis(IBatis)框架使用;
HibernateTransactionManager: Hibernate使用(由Hibernate實現);
spring中7種事務傳播行爲
事務傳播行爲:解決的是業務層之間的方法調用問題。
spring事務傳播機制 | 含義 |
---|---|
PROPAGATION_REQUIRED(默認值) | 如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。 |
PROPAGATION_SUPPORTS | 支持當前事務,如果當前沒有事務,就以非事務方式執行。 |
PROPAGATION_MANDATORY | 使用當前的事務,如果當前沒有事務,就拋出異常。 |
PROPAGATION_REQUIRES_NEW | 新建事務,如果當前存在事務,把當前事務掛起。 |
PROPAGATION_NOT_SUPPORTED | 以非事務方式執行操作,如果當前存在事務,就把當前事務掛起,就是使用兩個不同事務的意思. |
PROPAGATION_NEVER | 以非事務方式執行,如果當前存在事務,則拋出異常。 |
PROPAGATION_NESTED | 如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類似的操作。 |
事務傳播行爲參考: https://segmentfault.com/a/1190000013341344
Spring編程式事務管理
一般不推薦使用spring的編程事務管理。 但spring提供了模板類TransactionTemplate,支持以編程的方式來管理事務。 需要將TransactionTemplate注入到IOC容器中:
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"/>
</bean>
Spring聲明式事務管理
Spring的聲明式事務管理其實就是利用AOP實現的。