事務基本概念
《Transaction 那點事兒》這篇文章通俗易懂的講解了事務的基本概念、事務特性、引發的問題、JDBC事務解決方案、Spring解決方案,等。
文章主要內容思維導圖
Spring + MyBatis事務配置
《spring+mybatis事務配置》這篇文章講解了Spring實現事務管理的兩種配置方式:
- 聲明式事務管理配置
<!-- 1. 配置事務管理 -->
<bean name="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 2. 事務相關控制配置:例如配置事務的傳播機制 -->
<tx:advice id="iccardTxAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="delete*" propagation="REQUIRED" read-only="false"
rollback-for="java.lang.Exception"
no-rollback-for="java.lang.RuntimeException"/>
<tx:method name="insert*" propagation="REQUIRED" read-only="false"
rollback-for="java.lang.RuntimeException" />
<tx:method name="add*" propagation="REQUIRED" read-only="false"
rollback-for="java.lang.RuntimeException" />
<tx:method name="create*" propagation="REQUIRED" read-only="false"
rollback-for="java.lang.RuntimeException" />
<tx:method name="update*" propagation="REQUIRED" read-only="false"
rollback-for="java.lang.Exception" />
<tx:method name="find*" propagation="SUPPORTS" />
<tx:method name="get*" propagation="SUPPORTS" />
<tx:method name="select*" propagation="SUPPORTS" />
<tx:method name="query*" propagation="SUPPORTS" />
</tx:attributes>
</tx:advice>
<!-- 3. 把事務控制在service層 -->
<aop:config>
<aop:pointcut id="iccardTerm"
expression="execution(public * com.shfft.iccardterm.service.*.*(..))" />
<aop:advisor pointcut-ref="iccardTerm" advice-ref="iccardTxAdvice" />
</aop:config>
- 注解式事務管理配置
<!-- 1. 定義事務管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 2. 使用注釋事務 -->
<tx:annotation-driven transaction-manager="transactionManager" />
@Transactional(propagation=Propagation.REQUIRED,
rollbackFor=Exception.class, timeout=1,
isolation=Isolation.DEFAULT)
public void saveUser(Map<String, String> map) throws Exception {
System.out.println("方法開始");
for (int i = 0; i < 500000; i++) {
System.out.println("*");
}
System.out.println("進入保存");
userDao.saveUser(map);
System.out.println("退出保存");
}