spring事務管理器:
pring事務管理器高層抽象主要包括3個接口:
PlatformTransactionManager事物管理器
TransactionDefinition事物的定義信息(隔離,傳播,超時,只讀)
TransactionStatus 事物具體運行狀態
搭建轉賬環境:
package com.hkd.dao;
import org.springframework.jdbc.core.JdbcTemplate;
public class OrdersDao {
//創建模板對象變量
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
//在dao層只做數據庫的操作
public void lessMoney(){
String sql="update account set salary=salary-? where username=?";
jdbcTemplate.update(sql, 1000, "李華");
}
public void addMoney(){
String sql="update account set salary=salary+? where username=?";
jdbcTemplate.update(sql, 1000, "黎明");
}
}
//業務類
package com.hkd.service;
import com.hkd.dao.OrdersDao;
public class OrdersService {
private OrdersDao ordersdao;
public void setOrdersdao(OrdersDao ordersdao) {
this.ordersdao = ordersdao;
}
//調用dao方法,業務邏輯,寫轉賬操作
public void account(){
//調用方法實現轉賬
ordersdao.addMoney();
ordersdao.lessMoney();
}
}
產生的問題:
1-如果轉賬過程中一方出現異常的狀況,如:小王轉給小六一千後出現異常,小王的前少了,但是小劉的錢沒有增加,那
麼導致這個前丟失。
解決:添加事務解決,出現異常進行回滾操作
聲明式事務管理(xml配置)
使用aop思想進行配置
1- 配置事務管 理器
2-配置事務的增強
3-配置切面
<!-- 配置c3p0連接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!-- 注入對象裏面的屬性值 -->
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql:///springday03"></property>
<property name="user" value="root"></property>
<property name="password" value="root"></property>
</bean>
<!--*******************************************配置文件方式(aop思想)事務管理器開始******************************************** -->
<!--第一步:部配置事務管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--屬性值注入,指定數據庫-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--第二步:部配置事務的增強 -->
<!-- transaction-manager會自動指向事務管理器 -->
<tx:advice id="txadvice" transaction-manager="transactionManager">
<!--事務操作 -->
<tx:attributes>
<!--設置進行事務操作的方法匹配規則 ,匹配只能做什麼規則的方法做事務,
說明:結構固定,以後開發需要修改的就是<tx:method name="account*"/>裏面的方法參數
-->
<tx:method name="account*"/>
</tx:attributes>
</tx:advice>
<!--第三步:配置切面 -->
<aop:config>
<!-- 切入點 -->
<aop:pointcut expression="execution(* com.hkd.service.OrdersService.*(..))" id="pointcut1"/>
<!--切面 -->
<aop:advisor advice-ref="txadvice" pointcut-ref="pointcut1"/>
</aop:config>
<!-- *******************************************事務管理器配置結束****************-->
聲明式事務管理(註解)
<!--*******************************************註解方式,事務管理器開始 -->
<!--第一步:部配置事務管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--屬性值注入,指定數據庫-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--第二步:開啓事務的註解 -->
<!-- transaction-manager="transactionManager"指定用的哪個事物管理器 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 第三步:要在使用事務的方法所在類上面添加註解 -->
<!-- **********************事務管理器配置結束****************-->