什么是事务?
就是怎么处理两个事务之间的关系
假设A方法出现了异常那么 B方法要不要回滚呢?
又或者B方法出现异常,A方法要不要回滚?
需要该怎么做不需要又该怎么做?
这类问题就可以用到spring给出的7种事务传播特性解决
1、Propagation.REQUIRED (默认事务):
如果当前存在了事务,那就融入这个事务中,没有则重新创建
假设出现异常那么update() 和 delete() 方法都会执行失败,因为在同一个事务中。
2、Propagation.REQUIRES_NEW:
需要一个新事物,不管外部有没有,如果原来有,就挂起原事务
可以用在记录日志, 银行取钱,中间调用一个 log(); 记录日志方法,
不管取钱是失败还是成功都记录一次
3、Propagation.NESTED:
如果没有,就新建一个事务;如果有,就在当前事务中嵌套其他事务
(嵌套事务,子事务回滚不影响外层事务,但是外层事务回滚子事务会一起回滚)
@Service
class Service{
@Transactional
public void Parents(){
Sysout.out.println(" 我出错了,son一起回滚");
son();
}
@Transactional(propagation = Propagation.NESTED)
public void son(){
Sysout.out.println(" 我出错了,我自己回滚");
}
}
PROPAGATION_REQUEIRES_NEW:肯定会创建子事务,父子互不影响;
PROPAGATION_NESTED:肯定会创建子事务,父影响子,子不影响父;
PROPAGATION_REQUEIRED:子事务和父事务合并成一个事务,父子互相影响;
4、Propagation.SUPPORTS:
如果没有就以非事务的方式执行,如果有则融入该事务
@Service
class Service{
@TransacTional
public void updateUser(){
findAll();
}
// 这类 事务建议放在查询语句中
@Transactional(propagation = Propagation.SUPPORTS)
public List<User> findAll(){
deleteUser();
}
@TransacTional
public void updateUser(){
Sysout.out.println(" delete,如果findAll方法没有@Transactional(propagation = Propagation.SUPPORTS");
Sysout.out.println(" 那updateUser的事务就没办法延续到这里");
}
}
死活都不要事务的
5、Propagation.NEVER: 只要有事务我就报错
6、Propagation.NOT_SUPPORTED: 没有就非事务执行,有就直接挂起,然后非事务执行
@Service
class Service{
@Transactional
public void Boss(){
Sysout.out.println(" 我是老板");
worker2();
worker1();
}
@Transactional(propagation = Propagation.NEVER)
public void worker1(){
Sysout.out.println(" 我是工人1,我不要事务,给我就报错");
}
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void worker1(){
Sysout.out.println(" 我是工人2,没有事务最好,你的事务管不着我,你先等我执行完你的事务才能走");
}
}
7、Propagation.MANDATORY:
如果没有,就抛出异常,如果有,就是用当前的
@Service
class Service{
@Transactional
public void A(){
B();
}
@Transactional(propagation = Propagation.MANDATORY)
public void B(){
System.out.println("反正我不创建事务,但是没有我就报错");
}
}