传播行为:有七大传播行为,也是在TransactionDefinition接口中定义。
- PROPAGATION_REQUIRED:支持当前事务,如当前没有事务,则新建一个。
- PROPAGATION_SUPPORTS:支持当前事务,如当前没有事务,则已非事务性执行。
- PROPAGATION_MANDATORY:支持当前事务,如当前没有事务,则抛出异常(强制一定要在一个已经存在的事务中执行,业务方法不可独自发起自己的事务)。
- PROPAGATION_REQUIRES_NEW:始终新建一个事务,如当前原来有事务,则把原事务挂起。
- PROPAGATION_NOT_SUPPORTED:不支持当前事务,始终已非事务性方式执行,如当前事务存在,挂起该事务。
- PROPAGATION_NEVER:不支持当前事务;如果当前事务存在,则引发异常。
- PROPAGATION_NESTED:如果当前事务存在,则在嵌套事务中执行,如果当前没有事务,则执行与 PROPAGATION_REQUIRED 类似的操作
PROPAGATION_REQUIRED:(外面影响里面,里面影响外面)
若addUser的方法没有事务,则创建一个新事务,若有事务,则加入当前事务。
如果addUser的方法抛出异常,则addUser,addWallet的方法都会回滚,
@Transactional(propagation = Propagation.REQUIRED)
public void addUser() {
TbUser tbUser = new TbUser();
tbUser.setId(1);
tbUser.setAge(20);
tbUser.setName("tzhl");
tbUserMapper.insert(tbUser);
walletServcie.addWallet(tbUser.getId());
int n = 1/0;
}
@Transactional(propagation = Propagation.REQUIRED)
public void addWallet(Integer userId) {
Wallet wallet = new Wallet();
wallet.setId(1);
wallet.setUserId(userId);
wallet.setWallet(new BigDecimal(0));
walletMapper.insert(wallet);
// int n = 1/0;
}
都回滚
如果addWallet的方法抛出异常,则看addUser有没有捕获,没有捕获的话,addUser会回滚
@Transactional(propagation = Propagation.REQUIRED)
public void addUser() {
TbUser tbUser = new TbUser();
tbUser.setId(1);
tbUser.setAge(20);
tbUser.setName("tzhl");
tbUserMapper.insert(tbUser);
walletServcie.addWallet(tbUser.getId());
//int n = 1/0;
}
@Transactional(propagation = Propagation.REQUIRED)
public void addWallet(Integer userId) {
Wallet wallet = new Wallet();
wallet.setId(1);
wallet.setUserId(userId);
wallet.setWallet(new BigDecimal(0));
walletMapper.insert(wallet);
int n = 1/0;
}
捕获了的话,则addUser方法会抛出新的异常Transaction rolled back because it has been marked as rollback-only 都会回滚
@Transactional(propagation = Propagation.REQUIRED)
public void addUser() {
TbUser tbUser = new TbUser();
tbUser.setId(1);
tbUser.setAge(20);
tbUser.setName("tzhl");
tbUserMapper.insert(tbUser);
try {
walletServcie.addWallet(tbUser.getId());
}catch (Exception e){
e.getStackTrace();
}
//int n = 1/0;
}
@Transactional(propagation = Propagation.REQUIRED)
public void addWallet(Integer userId) {
Wallet wallet = new Wallet();
wallet.setId(1);
wallet.setUserId(userId);
wallet.setWallet(new BigDecimal(0));
walletMapper.insert(wallet);
int n = 1/0;
}
捕获了的话,加上TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
则addUser不会抛出异常,都会回滚
@Transactional(propagation = Propagation.REQUIRED)
public void addUser() {
TbUser tbUser = new TbUser();
tbUser.setId(1);
tbUser.setAge(20);
tbUser.setName("tzhl");
tbUserMapper.insert(tbUser);
try {
walletServcie.addWallet(tbUser.getId());
}catch (Exception e){
e.getStackTrace();
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
//int n = 1/0;
}
@Transactional(propagation = Propagation.REQUIRED)
public void addWallet(Integer userId) {
Wallet wallet = new Wallet();
wallet.setId(1);
wallet.setUserId(userId);
wallet.setWallet(new BigDecimal(0));
walletMapper.insert(wallet);
int n = 1/0;
}
若addUser方法有事务,addWallet方法没有事务,addWalle方法抛出异常,addUser方法捕获,
加上TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();都会回滚
@Transactional(propagation = Propagation.REQUIRED)
public void addUser() {
TbUser tbUser = new TbUser();
tbUser.setId(1);
tbUser.setAge(20);
tbUser.setName("tzhl");
tbUserMapper.insert(tbUser);
try {
walletServcie.addWallet(tbUser.getId());
}catch (Exception e){
e.getStackTrace();
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
//int n = 1/0;
}
//@Transactional(propagation = Propagation.SUPPORTS)
public void addWallet(Integer userId) {
Wallet wallet = new Wallet();
wallet.setId(1);
wallet.setUserId(userId);
wallet.setWallet(new BigDecimal(0));
walletMapper.insert(wallet);
int n = 1/0;
}
PROPAGATION_SUPPORTS:(外面的影响里面的,里面的影响外面的)
如果addUser没有事务,则addWallet以非事务的方式运行,如果addUser有事务,则使用当前事务;
如果addUser没有事务,则addUser和addWallet的运行出现异常都不会回滚
如果addUser有事务,
addUser的方法抛出异常,都会回滚。
addWallet的方法抛出异常,addUser未捕获,都会回滚。
addWallet的方法抛出异常,addUser捕获了,则addUser方法会抛出新的异常Transaction rolled back because it has been marked as rollback-only,都会回滚。
addUser捕获了的话,加上TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
则addUser不会抛出异常,都会回滚
PROPAGATION_MANDATORY:(外面的影响里面的,里面的影响外面的)
如果addUser没有事务,就抛出异常,如果addUser有事务,就使用当前事务。
如果addUser没有事务就抛出异常,No existing transaction found for transaction marked with propagation 'mandatory
addWallet的运行出现异常,addUser不会回滚,addWallet会回滚
如果addUser有事务
如果addUser的方法抛出异常,则addUser和addWallet都会回滚
addWallet的方法抛出异常,addUser捕获了,则addUser方法会抛出新的异常Transaction rolled back because it has been marked as rollback-only,都会回滚。
addUser捕获了的话,加上TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
则addUser不会抛出异常,都会回滚
PROPAGATION_REQUIRES_NEW:(外面不影响里面,里面(不)影响外面)
若addUser的方法没有事务,则新建一个事务,若有事务,就创建一个新事务。
若addUser的方法有事务,
如果addUser的方法抛出异常,则addUser的事务回滚,addWallet的事务不受影响
如果addWallet的方法抛出异常,addWallet回滚,addUser不捕获则回滚,捕获则不受影响,不回滚
PROPAGATION_NOT_SUPPORTED: 不支持事务
如果addUser没有事务,就以非事务方式执行,如果有,就将当前事务挂起。
若addUser的方法有事务,
如果addUser的方法抛出异常,则addUser的事务回滚,addWallet的事务不受影响
如果addWallet的方法抛出异常,addWallet不会回滚,addUser不捕获则回滚,捕获则不受影响,不回滚
PROPAGATION_NEVER:
如果A没有事务,就以非事务方式执行。如果有,就抛出异常。Existing transaction found for transaction marked with propagation 'never'"都回滚
PROPAGATION_NESTED :(外面的影响里面的,里面的(不)影响外面的)
若addUser的方法没有事务,则新建一个事务,若有事务,则在里面嵌套一个事务。
若addUser的方法没有事务,
如果addWallet的方法抛出异常,则addWallet回滚,addUser不回滚;
如果addUser的方法抛出异常,则都不回滚
若addUser的方法有事务:
如果addWallet的方法抛出异常,则addWallet回滚
如果addUser的方法不捕获异常,则回滚,捕获则不回滚
如果addUser的方法抛出异常,则都回滚