Spring事务传播行为
传播:至少有两个东西,才可发生传播。也就是至少两个方法之间在相互调用
事务传播行为(propagation behavior)指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行。
A方法 调用B方法 那么B方法应该如何执行
事务是数据库的行为
事务传播行为,是spring框架自己添加的功能
spring定义了七种传播行为:
事务传播行为类型 | 说明 |
---|---|
PROPAGATION_REQUIRED | 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。 |
PROPAGATION_SUPPORTS | 支持当前事务,如果当前没有事务,就以非事务方式执行。 |
PROPAGATION_MANDATORY | 使用当前的事务,如果当前没有事务,就抛出异常。 |
PROPAGATION_REQUIRES_NEW | 新建事务,如果当前存在事务,把当前事务挂起。 |
PROPAGATION_NOT_SUPPORTED | 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 |
PROPAGATION_NEVER | 以非事务方式执行,如果当前存在事务,则抛出异常。 |
PROPAGATION_NESTED | 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与 PROPAGATION_REQUIRED 类似的操作。 |
PROPAGATION_REQUIRED
A方法有事务
A方法中出现了异常,B方法中的事务也是不会提交的
BankService
package spring.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import spring.dao.BankDao;
import spring.dao.LogDao;
@Service(value = "bankService")
//@Transactional//添加在类的上面,表示此类中所有方法,都在spring事务管理中进行
public class BankService {
@Autowired
BankDao bankDao;
@Autowired
LogService logService;
/*
* 转账操作
* 以后我们的事务管理都在Service层执行
* */
@Transactional(propagation = Propagation.REQUIRED)//也可以在方法中添加,只是这个方法在事务管理中进行
public void zhuangzhang()
{
bankDao.jian();
//System.out.println(10/0);
bankDao.jia();
}
/*
Propagation.REQUIRED 会开启事务,在事务中执行
A方法 是有事务的,事务传播行为REQUIRED
* */
@Transactional(propagation = Propagation.REQUIRED)
public void addAccount()
{
logService.addLog();
System.out.println(10/0);
bankDao.addAccount();
}
}
BankDao
package spring.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
@Repository
public class BankDao {
@Autowired
JdbcTemplate jdbcTemplate;
public void jian()
{
jdbcTemplate.update("UPDATE bank SET money=money-500 where id = 1");
}
public void jia(){
//spring的jdbcTemplate默认情况是自动提交事务的
jdbcTemplate.update("UPDATE bank SET money=money+500 where id = 2");
}
public void addAccount() {
jdbcTemplate.update("insert into bank(account,money)values(789,1000)");
}
}
LogService
package spring.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import spring.dao.LogDao;
@Service
public class LogService {
@Autowired
LogDao logDao;
/*
* Propagation.REQUIRED
* B方法的传播行为也是REQUIRED的,那么B方法就会加入到A方法的事务中执行,两个合二为一
* A方法中出现了异常,B方法中的事务也是不会提交的
* */
@Transactional(propagation = Propagation.REQUIRED)
public void addLog()
{
logDao.addlog();
}
}
LogDao
package spring.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
public class LogDao {
@Autowired
JdbcTemplate jdbcTemplate;
public void addlog()
{
jdbcTemplate.update("insert into log(content)values ('添加账号')");
}
}
test
package spring.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import spring.service.BankService;
import spring.service.StudentService;
public class Test5 {
//之前使用对象是在哪儿用,在哪new
//User user = new User(); 原始的对象
public static void main(String[] args) {
/*
* 启动spring框架,读取配置文件
*
* IOC 控制反转 是spring的核心功能
* 控制反转:将生成对象的权利 反转给spring框架,由spring框架同一管理
* */
ApplicationContext app = new ClassPathXmlApplicationContext("spring.xml");//读取spring.xml文件,加载容器
BankService bankService = app.getBean("bankService",BankService.class);
bankService.addAccount();
}
}
A方法没有事务
日志存进去了,账号没存进去
BnakService
package spring.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import spring.dao.BankDao;
import spring.dao.LogDao;
@Service(value = "bankService")
//@Transactional//添加在类的上面,表示此类中所有方法,都在spring事务管理中进行
public class BankService {
@Autowired
BankDao bankDao;
@Autowired
LogService logService;
/*
* 转账操作
* 以后我们的事务管理都在Service层执行
* */
@Transactional(propagation = Propagation.REQUIRED)//也可以在方法中添加,只是这个方法在事务管理中进行
public void zhuangzhang()
{
bankDao.jian();
//System.out.println(10/0);
bankDao.jia();
}
/*
Propagation.REQUIRED 会开启事务,在事务中执行
A方法 是有事务的,事务传播行为REQUIRED
A方法 没有事务
* */
//@Transactional(propagation = Propagation.REQUIRED)
public void addAccount()
{
logService.addLog();