事物的七种传播行为

事务传播行为类型


事务传播行为类型


说明


PROPAGATION_REQUIRED


如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。


PROPAGATION_SUPPORTS


支持当前事务,如果当前没有事务,就以非事务方式执行。


PROPAGATION_MANDATORY


使用当前的事务,如果当前没有事务,就抛出异常。


PROPAGATION_REQUIRES_NEW


新建事务,如果当前存在事务,把当前事务挂起。


PROPAGATION_NOT_SUPPORTED


以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。


PROPAGATION_NEVER


以非事务方式执行,如果当前存在事务,则抛出异常。


PROPAGATION_NESTED


如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类 似的操作。

罗列了7种spring的事务传播行为,我们具体来看看它的实现。在这里,我们使用spring annotation注解实现事务。

实现事务的类BusinessServiceImpl

package com.aop;  

import org.springframework.aop.support.AopUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;  

import com.entity.Student;  

@Service("businessSerivce")
public class BusinessServiceImpl implements IBaseService {  

    @Autowired
    IStudentDao studentDao;  

    @Autowired
    IBaseServiceB baseServiceb;  

    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, rollbackFor = Exception.class)
    public String doA() throws Exception {
        Student st = new Student();
        st.setId(1);
        st.setSex("girl");
        st.setUsername("zx");
        studentDao.insertStudent(st);  

        System.out.println(baseServiceb);
        System.out.println("是否是代理调用,AopUtils.isAopProxy(baseServiceb) : " + AopUtils.isAopProxy(baseServiceb));
        System.out
                .println("是否是cglib类代理调用,AopUtils.isCglibProxy(baseServiceb) : " + AopUtils.isCglibProxy(baseServiceb));
        System.out.println("是否是jdk动态接口代理调用,AopUtils.isJdkDynamicProxy(baseServiceb) : "
                + AopUtils.isJdkDynamicProxy(baseServiceb));  

        //使用代理调用方法doB()
        baseServiceb.doB();
        int i = 1 / 0;// 抛出异常,doB()的事务事务回滚
        return "success";
    }  

    // @Transactional(propagation = Propagation.REQUIRES_NEW, isolation =
    // Isolation.DEFAULT, rollbackFor = Exception.class)
    // public String doB() throws Exception {
    // Student st = new Student();
    // st.setId(2);
    // st.setSex("girl");
    // st.setUsername("zx2");
    // studentDao.insertStudent(st);
    //
    // return "success";
    // }  

}  

实现事务的类BusinessServiceImpl

package com.aop;  

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;  

import com.entity.Student;  

@Service("businessSerivceB")
public class BusinessServiceImplB implements IBaseServiceB {  

    @Autowired
    IStudentDao studentDao;  

    @Transactional(propagation = Propagation.REQUIRES_NEW,isolation=Isolation.DEFAULT,rollbackFor=Exception.class)
    public String doB() throws Exception {
        Student st = new Student();
        st.setId(2);
        st.setSex("girl");
        st.setUsername("zx2");
        studentDao.insertStudent(st);
        return "success";
    }  

}

测试类:

package com.aop;  

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;  

import com.thread.service.IBaseFacadeService;  

//@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration(locations = { "classpath:/spring-ibatis.xml", "classpath:/spring-jdbctemplate.xml" })
public class TestStudentDao {  

    public static void main(String[] args) {
          try {
          BeanFactory factory = new ClassPathXmlApplicationContext("spring-jdbctemplate.xml");
          IBaseService service = (IBaseService) factory.getBean("businessSerivce");  

              service.doA();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}  

测试结果:

[email protected]
是否是代理调用,AopUtils.isAopProxy(baseServiceb) : true
是否是cglib类代理调用,AopUtils.isCglibProxy(baseServiceb) : true
是否是jdk动态接口代理调用,AopUtils.isJdkDynamicProxy(baseServiceb) : false

时间: 2024-08-09 10:41:59

事物的七种传播行为的相关文章

数据事务四种隔离机制和七种传播行为

一.隔离级别: 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted.Read committed.Repeatable read.Serializable,这四个级别可以逐个解决脏读.不可重复读.幻读这几类问题. 1. ISOLATION_READ_UNCOMMITTED:这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据.      这种隔离级别会产生脏读,不可重复读和幻像读.2. ISOLATION_READ_COMMITTED:保证一个事务修改的

事务的四种隔离级别和七种传播行为

很多人容易搞混不可重复读和幻读,确实这两者有些相似.但不可重复读重点在于update和delete,而幻读的重点在于insert. 避免不可重复读需要锁行就行 避免幻影读则需要锁表 如果使用锁机制来实现这两种隔离级别,在可重复读中,该sql第一次读取到数据后,就将这些数据加锁,其它事务无法修改这些数据,就可以实现可重复 读了.但这种方法却无法锁住insert的数据,所以当事务A先前读取了数据,或者修改了全部数据,事务B还是可以insert数据提交,这时事务A就会 发现莫名其妙多了一条之前没有的数

spring事物的七种事物传播属性行为及五种隔离级别

首先,说说什么事务(Transaction). 事务,就是一组操作数据库的动作集合.事务是现代数据库理论中的核心概念之一.如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务.当所有的步骤像一个操作一样被完整地执行,我们称该事务被提交.由于其中的一部分或多步执行失败,导致没有步骤被提交,则事务必须回滚到最初的系统状态. 其中spring七个事物传播属性: PROPAGATION_REQUIRED -- 支持当前事务,如果当前没有事务,就新建一个事务.这是最常见的选择. PR

数据库事务的四种隔离机制和七种传播行为

MySQL数据库为我们提供的四种隔离级别:(依次解决脏读.不可重复读.幻读) ① Serializable (串行化):可避免脏读.不可重复读.幻读的发生. ② Repeatable read (可重复读):可避免脏读.不可重复读的发生.(Mysql默认的方式) ③ Read committed (读已提交):可避免脏读的发生.(Oracle默认的方式) ④ Read uncommitted (读未提交):最低级别,任何情况都无法保证.(INNODB内部机制) 数据库事务正常执行的四个特性: A

spring事务的7种传播行为

事务传播行为 什么叫事务传播行为?听起来挺高端的,其实很简单. 即然是传播,那么至少有两个东西,才可以发生传播.单体不存在传播这个行为. 事务传播行为(propagation behavior)指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行. 例如:methodA事务方法调用methodB事务方法时,methodB是继续在调用者methodA的事务中运行呢,还是为自己开启一个新事务运行,这就是由methodB的事务传播行为决定的. Spring定义了七种传播行为: 现在来

spring 七种事务

七种事务类型: 1.propagation_required:支持当前事务,无事务,另起新事物 2.propagation_required-new:新建事务,若有旧事务,挂起. 3.propagation_supports:支持当前事务,无事务,以非事务执行 4.propagation_mandatory:以事务方式执行,无事务,抛异常 5.propagation_not_supported:不支持事务,如有事务,挂起 6.propagation_never:以非事务执行,有事务,抛异常 7.

数据分析师:数据分析工作常见七种错误及其规避技巧(转自经管之家)

数据分析师:数据分析工作常见七种错误及其规避技巧商业领域的数据科学家和侦探类似:去探索未知的事物.不过,当他们在这个旅程中冒险的时候,他们很容易落入陷阱.所以要明白,这些错误是如何造成的,以及如何避免.“ ... 数据分析师:数据分析工作常见七种错误及其规避技巧 商业领域的数据科学家和侦探类似:去探索未知的事物.不过,当他们在这个旅程中冒险的时候,他们很容易落入陷阱.所以要明白,这些错误是如何造成的,以及如何避免. “错误是发现的入口.”——James Joyce (著名的爱尔兰小说家). 这在

双十一在即,阿里的七种武器

双十一临近,普大喜奔.天猫不是一个人在战斗.阿里十五年来,构建了丰富的产业生态,统称为阿里系.一支穿云箭,千军万马来相见.今天我们就来盘点一下阿里系各路诸侯,将如何助阵? 堪任一方霸主的诸侯,有微博.优酷.UC.菜鸟.支付宝等,共担信息流.资金流.物流的重任,特别是新加盟的微博.优酷.UC,对应着社交流量.视频流量和移动流量.阿里对其投资收购的成效,双十一是一场大考. 古龙大侠的<七种武器>系列实为六种,阿里系诸侯按风格气质,可与其中一种相比. 长生剑:支付不是问题 就看支付宝刷记录的能力了

Spring的4种事务特性,5种隔离级别,7种传播行为

spring事务: 什么是事务: 事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. 事务特性(4种): 原子性 (atomicity):强调事务的不可分割. 一致性 (consistency):事务的执行的前后数据的完整性保持一致. 隔离性 (isolation):一个事务执行的过程中,不应该受到其他事务的干扰 持久性(durability) :事务一旦结束,数据就持久到数据库 如果不考虑隔离性引发安全性问题: 脏读 :一个事务读到了另一个事务的未提交的数据 不可重