1.工程说明
以下对事物的测试基于我的另一片博客的工程
https://blog.csdn.net/u012430402/article/details/80587412
2.Spring核心配置文件的配置
在applicationContext.xml中添加如下配置,开启注解式事物,及注解扫描
<!-- 扫描注解 -->
<context:component-scan base-package="com.xiao"/>
<!-- 配置事物管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 开启事物注解-->
<tx:annotation-driven />
3.测试
首先来看一下数据库中的数据
测试思路:把password字段的数据看成金钱,第一个用户减少多少,第二个用户就增加多少,要么同时成功,要么都不成功。
书写UserDao_02,分别写一个减少和增加的方法,如下
package com.xiao.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
/**
* @Author 笑笑
* @Date 9:11 2018/06/08
*/
@Repository
public class UserDao_02 {
@Autowired
private JdbcTemplate jdbcTemplate;
//减少的方法
public void decrease(String password,Integer id){
String sql = "update tb_user set password = password-? where id = ?";
jdbcTemplate.update(sql,password,id);
}
//增加的方法
public void add(String password,Integer id){
String sql= "update tb_user set password = password+? where id = ?";
jdbcTemplate.update(sql,password,id);
}
}
书写UserService,调用减少和增加的方法,先不添加事物的注解,如下
package com.xiao.service;
import com.xiao.dao.UserDao_02;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* @Author 笑笑
* @Date 10:24 2018/06/08
*/
@Service
public class UserService {
@Autowired
private UserDao_02 userDao02;
public void trans(String password, Integer id_01,Integer id_02){
//调用减少的方法,将id为1的用户的密码减少
userDao02.decrease(password,id_01);
//调用增加的方法,将id为2的用户的密码增加
userDao02.add(password,id_02);
}
}
测试类TransactionTest中,调用UserService中的trans()方法,如下
import com.xiao.service.UserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @Author 笑笑
* @Date 21:52 2018/06/07
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class TransactionTest {
//注入UserService
@Autowired
private UserService userService;
@Test
public void test(){
userService.trans("1",1,2);
}
}
运行之后,数据库中的数据如下
从上图可以发现,两条更新的语句都成功的执行了,数据也没有问题
这时,我人为的在UserService的trans()方法的两条更新语句的中间加入除0操作,如下
public void trans(String password, Integer id_01,Integer id_02){
//调用减少的方法,将id为1的用户的密码减少
userDao02.decrease(password,id_01);
//除0操作
int i = 1/0;
//调用增加的方法,将id为2的用户的密码增加
userDao02.add(password,id_02);
}
运行之后,程序会抛出除0异常,数据库中的数据如下
从上图可以看出,第一条的更新语句成功的执行了,但是由于第二条的更新语句之前抛出了异常,并没有成功执行,这不是我所期望的结果
接着,我在trans()方法上加上@Transactional注解(此注解也可以作用于类上),如下
@Transactional
public void trans(String password, Integer id_01,Integer id_02){
//调用减少的方法,将id为1的用户的密码减少
userDao02.decrease(password,id_01);
//除0操作
int i = 1/0;
//调用增加的方法,将id为2的用户的密码增加
userDao02.add(password,id_02);
}
运行之后,数据库中的数据如下
从上图可以看出,由于程序抛出了异常,两条更新语句都没有执行
最后,我再把trans()方法中的除0操作移除,运行程序,数据库中的结果如下
可以看到,更新的语句都成功的执行了!