1-Transactional注解简介
常用方式
- 可以在类上,接口上进行使用,但是不建议这么使用,这样影响的范围太大。
- 默认只对非检查异常和error进行回滚,对检查性异常不进行回滚。使用rollbackFor属性可以指定当发生检查性异常的时候发生回滚。
- 可以在testcase上进行使用,但是默认会回滚。
验证非坚持异常不会回滚
非检查性异常发生不会进行回滚
@Transactional
@Override
public void checkExceptionMethod() throws IOException {
User user= User.builder()
.id(4)
.passWord("122")
.userName("hello")
.realName("realname")
.build();
userMapper.insertOne(user);
File file=new File("");
file.createNewFile();
}
而如果指定rallbackFor的值则会进行回滚
@Transactional(rollbackFor = Exception.class)
@Override
public void checkExceptionMethod() throws IOException {
User user= User.builder()
.id(4)
.passWord("122")
.userName("hello")
.realName("realname")
.build();
userMapper.insertOne(user);
File file=new File("");
file.createNewFile();
}
如果发生异常,并且使用try...catch进行捕获,这时候是否会发生回滚呢?
@Transactional(rollbackFor = Exception.class)
@Override
public void checkExceptionMethod() throws IOException {
User user= User.builder()
.id(4)
.passWord("122")
.userName("hello")
.realName("realname")
.build();
userMapper.insertOne(user);
try {
File file=new File("");
file.createNewFile();
} catch (IOException e) {
System.out.println("发生异常");
}
}
进过测试,当使用try...catch进行包裹异常的时候,不会发生回滚
在TestCase上使用
/**
* 1. 只有@Test,不会进行回滚
* 2. 如果在单元测试上加上@Transactional会回滚
* 3. 如果不想让单元测试进行回滚,使用@Rollback注解,并且value=false这样就可以让
* 单元测试提交事务。
*/
@Rollback(value = false)
@Transactional
@Test
public void testInsertOne(){
User user= User.builder()
.id(3)
.passWord("122")
.userName("hello")
.realName("realname")
.build();
userMapper.insertOne(user);
}
github仓库,地址为:
https://github.com/bulingfeng/spring-cloud-demo/tree/master/spring-transactional-demo