Spring学习笔记(08-注解式事物)

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,分别写一个减少和增加的方法,如下

扫描二维码关注公众号,回复: 1534089 查看本文章
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);
    }

}

运行之后,数据库中的数据如下


从上图可以发现,两条更新的语句都成功的执行了,数据也没有问题

这时,我人为的在UserServicetrans()方法的两条更新语句的中间加入除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操作移除,运行程序,数据库中的结果如下


可以看到,更新的语句都成功的执行了!

猜你喜欢

转载自blog.csdn.net/u012430402/article/details/80616119
今日推荐