文章目录
前言
之前文章中介绍过【Spring事务详解】— 3.事务失效的八种场景,本文再针对事务在多层Service中调用的情况做一些补充。
一、演示说明
数据表
CREATE TABLE `t_user_demo` (
`id` int(11) NOT NULL,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
后台调用逻辑
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
private TranService1 tranService1;
@RequestMapping("update")
public void update() {
tranService1.update();
}
}
@Service
public class TranService1 {
@Resource
private TranService2 tranService2;
public void update() {
tranService2.update();
}
}
@Service
public class TranService2 {
@Resource
private UserMapper userMapper;
public void update() {
userMapper.update();
}
}
<update id="update">
update t_user_demo set name = 'zs'
</update>
二、案例描述
1.外层有事务、内层没事务、内层抛异常(数据会回滚)
@Service
public class TranService1 {
@Resource
private TranService2 tranService2;
@Transactional
public void update() {
tranService2.update();
}
}
@Service
public class TranService2 {
@Resource
private UserMapper userMapper;
public void update() {
userMapper.update();
// 模拟异常抛出
int i = 1 / 0;
}
}
2.外层有事务、内层没事务、内层抛异常、内层捕获(数据不会回滚)
@Service
public class TranService1 {
@Resource
private TranService2 tranService2;
@Transactional
public void update() {
tranService2.update();
}
}
public void update() {
try {
userMapper.update();
int i = 1 / 0;
}catch (Exception e){
e.printStackTrace();
}
}
3.外层有事务、内层没事务、内层抛异常、外层捕获(数据不会回滚)
@Service
public class TranService1 {
@Resource
private TranService2 tranService2;
@Transactional
public void update() {
try {
tranService2.update();
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Service
public class TranService2 {
@Resource
private UserMapper userMapper;
public void update() {
userMapper.update();
int i = 1 / 0;
}
}
4.外层没事务、内层有事务、内层抛异常、外层捕获(数据会回滚)
@Service
public class TranService1 {
@Resource
private TranService2 tranService2;
public void update() {
try {
tranService2.update();
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Service
public class TranService2 {
@Resource
private UserMapper userMapper;
@Transactional
public void update() {
userMapper.update();
int i = 1 / 0;
}
}
5.外层没事务、内层有事务、外层抛异常(数据不会回滚)
@Service
public class TranService1 {
@Resource
private TranService2 tranService2;
public void update() {
tranService2.update();
int i = 1 / 0;
}
}
@Service
public class TranService2 {
@Resource
private UserMapper userMapper;
@Transactional
public void update() {
userMapper.update();
}
}