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操作移除,运行程序,数据库中的结果如下
可以看到,更新的语句都成功的执行了!