Spring 的事务测试

简介: 今天测试了下事务 首先建立一个JUnit 类来进行测试第一种方式 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({"classpath*:/applicationContext.

自以为是

在我的想象当中,以为只要给这个方法注释成@Transactional, 就会处理事务,然而并非我想象的那样,今天测试了下事务,记录下

测试

1.首先建立一个JUnit 类来进行测试第一种方式

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath*:/applicationContext.xml" })
public class SpringTransTester {
    
    
    @Resource
    private UserMoneyMapper userMoney;
    
    @Transactional
    public void doInsert() {
        UserMoney ins = new UserMoney();
        ins.setId("2");
        ins.setBalance(100.00);
        userMoney.insert(ins);
        
        ins.setId("2");   // ID相同,会抛出异常
        ins.setBalance(99.00);
        userMoney.insert(ins);
    }
    
    @Test    
    public void testTrans() {
        List<UserMoney> list = userMoney.qryQuick("yangmf");
        doInsert();        
        System.out.println("testTrans");
    }
}

数据库中插入了一条记录,第二条出现了错误,但是没有进行回滚
百度查了下资料:

通一个类里面如果A方法没有事务,调用带事务B方法,这样B方法的事务会被忽略。

2. 改造下,把事务的方法单独放到Service中

// 注意该类放到Spring能扫描到的地方
@Service
public class SpringTransService {
    @Resource
    private UserMoneyMapper userMoney;
    
    @Transactional
    public void doInnerInsert() {
        UserMoney ins = new UserMoney();
        ins.setId("2");
        ins.setBalance(100.00);
        userMoney.insert(ins);
        
        ins.setId("2");   // ID相同,会抛出异常
        ins.setBalance(99.00);
        userMoney.insert(ins);
    }
    
    public void doInsert() {
        doInnerInsert();
    }
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath*:/applicationContext.xml" })
public class SpringTransTester {
    
    
    @Autowired
    private SpringTransService service;
    
    @Test    
    public void testTrans() {
        service.doInsert();
        System.out.println("testTrans");
    }
}

这样其实和第一种方法一样,由本类的方法来调用事务, 效果和第一个一样, 但是如果在doInsert上面也加上@Transactional,那么事务会起作用(doInnerInsert,的注解可以去掉)

3. 再改造下

// 注意该类放到Spring能扫描到的地方
@Service
public class SpringTransService {
    @Resource
    private UserMoneyMapper userMoney;
    
    @Transactional
    public void doInsert() {
        UserMoney ins = new UserMoney();
        ins.setId("2");
        ins.setBalance(100.00);
        userMoney.insert(ins);
        
        ins.setId("2");   // ID相同,会抛出异常
        ins.setBalance(99.00);
        userMoney.insert(ins);
    }
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath*:/applicationContext.xml" })
public class SpringTransTester {
    
    
    @Autowired
    private SpringTransService service;
    
    @Test    
    public void testTrans() {
        service.doInsert();
        System.out.println("testTrans");
    }
}

这样可以,插入第二条是出现了一次,记录没有插入进去

4. 再测试下抛出Exception异常

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath*:/applicationContext.xml" })
public class SpringTransTester {
    
    
    @Autowired
    private SpringTransService service;
    
    @Test    // 加上抛出异常
    public void testTrans() throws Exception {
        service.doInsert();
        System.out.println("testTrans");
    }
}
@Service
public class SpringTransService {
    @Resource
    private UserMoneyMapper userMoney;
    
    
    // 手动抛出异常
    @Transactional
    public void doInsert() throws Exception {
        UserMoney ins = new UserMoney();
        ins.setId("2");
        ins.setBalance(100.00);
        userMoney.insert(ins);            
        
        ins.setId("3");   // ID不同相同,会抛出异常
        ins.setBalance(99.00);
        userMoney.insert(ins);
        throw new Exception("测试事务");
    }
}

异常抛出了,事务没有起作用,数据都存进去了会, 如果把Exception改成RuntimeException,事务会进行回滚,看来异常不能简单的写个Exception。可以继承RuntimeException

目录
相关文章
|
1月前
|
监控 Java 数据处理
【Spring云原生】Spring Batch:海量数据高并发任务处理!数据处理纵享新丝滑!事务管理机制+并行处理+实例应用讲解
【Spring云原生】Spring Batch:海量数据高并发任务处理!数据处理纵享新丝滑!事务管理机制+并行处理+实例应用讲解
|
1月前
|
Java 数据库 Spring
Spring事务失效的场景详解
Spring事务失效的场景详解
33 0
|
1月前
|
Java 数据库 Spring
Spring事务的传播机制(行为、特性)
Spring事务的传播机制(行为、特性)
36 0
|
1月前
|
Java Spring
使用JDBCTemplate实现与Spring结合,方法公用 ——测试(EmpDaoImplTest)
使用JDBCTemplate实现与Spring结合,方法公用 ——测试(EmpDaoImplTest)
9 0
|
3月前
|
运维 监控 Java
Spring Cloud Alibaba分布式事务问题之事务commit失败如何解决
Spring Cloud Alibaba提供了一套在Spring Cloud框架基础上构建的微服务解决方案,旨在简化分布式系统的开发和管理;本合集将探讨Spring Cloud Alibaba在实际应用中的部署和使用技巧,以及该框架常见问题的诊断方法和解决步骤。
|
2月前
|
Java 关系型数据库 数据库连接
Spring源码解析--深入Spring事务原理
本文将带领大家领略Spring事务的风采,Spring事务是我们在日常开发中经常会遇到的,也是各种大小面试中的高频题,希望通过本文,能让大家对Spring事务有个深入的了解,无论开发还是面试,都不会让Spring事务成为拦路虎。
35 1
|
1月前
|
Java Spring
使用spring实现邮件的发送(含测试,源码,注释)
使用spring实现邮件的发送(含测试,源码,注释)
7 0
|
1月前
|
XML Java 数据库
【二十四】springboot整合spring事务详解以及实战
【二十四】springboot整合spring事务详解以及实战
106 0
|
1月前
|
Java 数据库 开发者
|
2月前
|
存储 Java 中间件
事务一致性测试
事务一致性测试
9 0

热门文章

最新文章