spring事務管理的兩種方式
(1)編程式事務管理(不用)
(2)聲明式事務管理1.基于xml配置文件實現(xiàn)2.基于注解實現(xiàn)
范例:搭建轉(zhuǎn)賬環(huán)境
1.創(chuàng)建數(shù)據(jù)庫表,添加數(shù)據(jù)id,username,salary
2.創(chuàng)建service和dao ,完成注入
需求:小王轉(zhuǎn)賬給小馬
dao:public void lessMoney(){
String sql = "update account set salary=salary-? where username=?";
jdbcTemplate.update(sql,100,"小王");
}
public moreMoney(){
String sql = "update account set salary=salary+? where username=?";
jdbcTemplate.update(sql,100,"小馬");
}
}
service:public void accountMoney(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
dao d = (dao) context.getBean("dao");
d.lessMoney();
d.moreMoney();
}
產(chǎn)生問題:(1)如果小王少了100之后,出現(xiàn)異常,小馬不會多100,錢丟失。
解決:添加事務解決,出現(xiàn)異常后進行回滾操作
聲明式事務管理(xml配置文件)
第一步?? 配置事務管理器‘
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
第二步? 配置事務的增強
<tx:advice id="txadvice(隨便)" transaction-manager="transactionManager">
<tx:attributes>
<!--設置進行事務操作的方法-->
<tx:method name="account*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
第三步?? 配置切面
<aop:config>
<!--切入點-->
<aop:pointcut expression="execution(*空格com.service.OrderService.*(..))" id="pointcut1"/>
<!--切面-->
<aop:advisor advice-ref="txadvice" pointcut-ref="poincut1"/>
</aop:config>
此時注意:MySql的MyISAM不支持事務,而InnoDB支持。而數(shù)據(jù)庫默認使用MyISAM引擎,所以需要手動修改引擎
聲明式事務管理(注解)
第一步? 配置事務管理器
第二步? 開啟事務注解
<tx:annoation-driven transaction-manager="transactionManager"/>
第三步?? 在要使用事務的方法的類上加注解
@Transactional
public class OrderService{
.......}