0、什么是事务
想象一个场景,A给B转账,A的钱转出去之后发生异常B没有收到钱,A的钱少了B的钱没有多,这不就乱套了吗?
所以就引出了事务这个概念:事务是数据库操作最基本的单元,逻辑上的一组操作,这一组操作要么都执行成功,要么都失败
事务的作用就是为了保证用户的每一个操作都是可靠的,事务中的每一步操作都 必须成功执行,只要有发生异常就回退到事务开始未进行操作的状态,这些操作 要么都完成,要么都取消,从而保证数据满足一致性的要求
如下这段代码,如果不添加事务管理,就会导致A的钱减少,但是B的钱没有增多,所以在Spring如何进行事务管理就显得非常重要了
public void zhuan() {
bankDao.send();
int i = 10 / 0;
bankDao.receive();
}
Spring 中的事务管理分为两种形式,一种是编程式事务,一种是声明式事务.
编程式事务在项目中很少使用 , 这种方式需要注入一个事务管理对象TransactionTemplate,然后在我们代码中需要提交事务或回滚事务时自己写代码实现.
声明式事务管理建立在 AOP 基础上,本质是对方法前后进行拦截,所以声明式 事务是方法级别的。
下面来看看声明式事务是如何开启的
1、使用注解实现声明式事务管理
步骤一:在spring配置文件中声明事务管理器
<!--创建事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据源-->
<property name="dataSource" ref="dataSource"></property>
</bean>
步骤二:在spring配置文件中,开启事务注解
<!--开启事务注解-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
步骤三:在spring配置文件中开启注解扫描
<!--开始注解扫描-->
<context:component-scan base-package="com.ff"></context:component-scan>
步骤四:根据业务需求在相应位置添加注解
@Transactional
这个注解可以添加到类上面也可以添加到方法上面
如果这个注解添加到类上面,表示这个类里面所有方法都开启事务
如果这个注解添加到方法上面,表示这个方法开启事务
@Service
public class BankService {
@Autowired
BankDao bankDao;
//转账的方法
@Transactional
public void zhuan() {
bankDao.send();
int i = 10 / 0;
bankDao.receive();
}
}
测试
public class BankServlet {
@Test
public void zhuan(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
BankService bankService = context.getBean("bankService", BankService.class);
bankService.zhuan();
}
}
在执行完送钱操作后出现异常,最终双方钱数都没有发生改变,测试成功