1. 事務(wù)的四個(gè)關(guān)鍵屬性(ACID)
- 原子性(atomicity): 事務(wù)是一個(gè)原子操作, 由一系列動(dòng)作組成. 事務(wù)的原子性確保動(dòng)作要么全部完成要么完全不起作用.
- 一致性(consistency): 一旦所有事務(wù)動(dòng)作完成, 事務(wù)就被提交. 數(shù)據(jù)和資源就處于一種滿足業(yè)務(wù)規(guī)則的一致性狀態(tài)中.
- 隔離性(isolation): 可能有許多事務(wù)會(huì)同時(shí)處理相同的數(shù)據(jù), 因此每個(gè)事物都應(yīng)該與其他事務(wù)隔離開來, 防止數(shù)據(jù)損壞.
- 持久性(durability): 一旦事務(wù)完成, 無論發(fā)生什么系統(tǒng)錯(cuò)誤, 它的結(jié)果都不應(yīng)該受到影響. 通常情況下, 事務(wù)的結(jié)果被寫到持久化存儲(chǔ)器中.
2. Spring 中的事務(wù)管理器的不同實(shí)現(xiàn)
3. Spring 的聲明式事務(wù)管理
3.1 使用配置文件進(jìn)行事務(wù)的聲明式管理
<!-- 聲明式事務(wù)管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="pooledDataSource" />
</bean>
<!-- 配置事物增強(qiáng)癌压,如何控制 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 所有以add開頭的方法都是事物方法 -->
<tx:method name="add*"
<!-- 事務(wù)傳播行為 -->
propagation="REQUIRES_NEW"
<!-- 事務(wù)隔離級(jí)別-->
isolation="READ_COMMITED"
<!---事務(wù)回滾屬性-->
rollback-for="java.lang.IOEXception,java.sql.SQLException"
no-rollback-for="java.lang.ArithmeticException"/>
<!-- 以get開始的所有方法 -->
<tx:method name="get*"
<!-- 只讀事務(wù)屬性-->
read-only="true"/>
</tx:attributes>
</tx:advice>
<aop:config>
<!-- aop切入點(diǎn)表達(dá)式 -->
<aop:pointcut expression="execution(* com.supreme.service..*(..))"
id="txPoint" />
<!-- 配置事務(wù)增強(qiáng) -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint" />
</aop:config>
3.2 使用@Transactional
注解聲明式的管理事務(wù)
<!-- 聲明式事務(wù)管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="pooledDataSource" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
3.2.1 @Transactional
注解使用細(xì)節(jié)
3.2.2 @Transactional
注解使用示例