文章目录
手动管理spring-jdbc事务
- 首先导入spring-jdbc的jar包
- 在service层依赖注入事务管理模板transactionTemplate
- 然后在spring配置文件中注入事务管理模板,
其中事务管理模板中需要注入属性事务管理器transactionManager,这个事务管理器实现了PlatformTransactionManager平台事务管理器接口;事务管理器需要注入属性datasource
- 最后用事务管理模板包裹一组逻辑操作即可完成事务管理
service层代码
package com.zzti.service.impl;
import com.zzti.dao.AccountDao;
import com.zzti.service.AccountService;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;
/**
* @Classname AccountServiceImpl
* @Description service层
* @Author jdq8576
* @Date 2019/2/18 21:59
* @Version 1.0
**/
public class AccountServiceImpl implements AccountService {
private AccountDao accountDao;
private TransactionTemplate transactionTemplate;
public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
this.transactionTemplate = transactionTemplate;
}
public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
@Override
public void transfer(String outer, String inner, Integer money) {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
accountDao.in(inner,money);
int i=1/0;
accountDao.out(outer,money);
}
});
}
}
applicationContext.xml
<bean id="accountService" class="com.zzti.service.impl.AccountServiceImpl">
<property name="accountDao" ref="accountDao"></property>
<property name="transactionTemplate" ref="transactionTemplate"></property>
</bean>
<!--配置事务管理器-->
<bean id="dataSourceTransactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--配置事务模板-->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="dataSourceTransactionManager"></property>
</bean>
面向代理工厂的spring事务管理
这种方式主要基于配置文件的事务管理,粘出applicationContext.xml,具体注释在配置文件里面
applicationContext.xml
<bean id="accountService" class="com.zzti.service.impl.AccountServiceImpl">
<property name="accountDao" ref="accountDao"></property>
</bean>
<!--配置工厂代理-->
<bean id="proxyAccountService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!--接口-->
<property name="proxyInterfaces" value="com.zzti.service.AccountService"></property>
<!--目标对象-->
<property name="target" ref="accountService"></property>
<!--事务管理器-->
<property name="transactionManager" ref="transactionManager"></property>
<!--事务的一些属性配置 需要一个properties类型的值-->
<!--
prop.key:确定哪些方法使用当前事务配置
prop.text:用于配置事务详情
格式: PROPAGATION ISOLATION readOnly,-Exception +EXception
传播行为 隔离级别 只读 异常回滚 异常提交
在这个五个中,后三个是可选的;但是可选只能选择一个.
+Exception:Exception是可以具体到哪种异常的
-->
<property name="transactionAttributes">
<props>
<prop key="transfer">PROPAGATION_REQUIRED,ISOLATION_DEFAULT,+java.lang.ArithmeticException</prop>
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
AccountServiceImpl实现类的代码
public void transfer(String outer, String inner, Integer money) {
accountDao.in(inner,money);
accountDao.out(outer,money);
}
测试类的代码
@Test
public void test(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
AccountService accountService = (AccountService) applicationContext.getBean("proxyAccountService");
accountService.transfer("jdq","yx",100);
}
使用spring的aop标签来管理事务
- 配置切入点
- 配置增强,在配置增强的时候,需要在spring的配置文件中注入事务管理器,但是在增强类中spring会帮我们自动注入这个属性。
- 这样配置的service层直接getBean(accountService)就行了,即可完成事务管理。
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--配置通知 事务管理器-->
<tx:advice id="transactionInterceptor">
<tx:attributes>
<tx:method name="transfer" propagation="REQUIRED" isolation="DEFAULT" read-only="true"/>
</tx:attributes>
</tx:advice>
<!--使用spring的aop标签来配置-->
<aop:config>
<!--切入点 experssion后面跟的的方法表达式-->
<aop:pointcut id="myPointCut"
expression="execution(* com.zzti.service.impl.AccountServiceImpl.transfer(..))"></aop:pointcut>
<!--事务与连接点相关联-->
<aop:advisor advice-ref="transactionInterceptor" pointcut-ref="myPointCut"></aop:advisor>
</aop:config>
注解方式
- 在applicationContext.xml直接注入事务管理器和事务管理器和开启事务管理
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--开始事务注解驱动-->
<tx:annotation-driven></tx:annotation-driven>
- 在具体类的方法或者类上直接加上注解@Transactional(readOnly = true),括弧里面是事务的传播行为,隔离级别等属性.
- 注解方式太好用了
需要的一下jar包
链接:我是链接
提取码:vv4k