Bootstrap

spring事务传播行为&集成mybatis&springMVC概述

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();
        
;