2018-09-25

    @Transactional(propagation=Propagation.NEVER)
public void update(){
Session s = sessionFactory.getCurrentSession();
Student stu = (Student)s.get(Student.class, 7);
System.out.println("ok" + stu.getName());
} @Transactional(propagation=Propagation.REQUIRED)
public void hasTran(){
update();
}

hasTran和update方法如果在一个bean方法里面,调用hasTran()的时候,并不报错。说明update并没有识别出它是never级别的事务传递,因为在同一个bean里面调用不识别。

如果把hasTran()放到另一个bean里面,调用hasTran()就会报错。

Existing transaction found for transaction marked with propagation 'never'

如果两个id重复了,有保护机制。

@Service
public class TestService2 {

  @Transactional(propagation=Propagation.REQUIRED)
  public void hasTran(){
    Session s = sessionFactory.getCurrentSession();
    Student stu = new Student();
    stu.setName("spring2018+++");
    s.update(stu);
    testService.update();
  }

}

@Service
public class TestService {

  @Transactional(propagation=Propagation.REQUIRED)
  public void update(){
    Session s = sessionFactory.getCurrentSession();
    Student stu = new Student();
    stu.setId(7);
    stu.setName("spring2016");
    s.update(stu);
  }

}

public static void main(String[] args) {

  TestService2 testService2 = (TestService2) context.getBean("testService2");
  testService2.hasTran();

}

Exception in thread "main" org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session : [cn.angelshelter.spring_study.pojo.Student#7]

还有在一个事务内,如果多次调用Student stu = (Student)s.get(Student.class, 7);方法,其实只是查询了一次,不会说执行一次查询一次。

如果方法A是REQUIRED的,方法B也是REQUIRED的,方法A调用方法B,方法B会抛出运行时异常,但是在A方法中,会try{ B },最后的结果是

Exception in thread "main" org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only

事务没有提交。

如果在上面的基础上,把B改为REQUIRES_NEW,然后A和B不是同一个事务,A的事务是可以提交的。

SUPPORTS最佛性,有事务就支持,没事务也通过。好像加了跟没加一个样。

NOT_SUPPORTED。无事务运行,如果你遇到一个方法

 Exception in thread "main" org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread 
那你加一个NOT_SUPPORTED它就不报错了。告诉程序,这个是没有事务也让它执行。
 
MANDATORY 要求有事务,要不然抛出异常。
 
刚发现REQUIRES_NEW有一定的危险性。有Studnet对象(id为7,张三),如果我在A方法中,把它的名字改为aa,然后调用B方法,B方法是REQUIRES_NEW的,这时候,如果把张三查询(按id查)出来,它的名字依然是张三,
而不是方法中改变的aa。
 
最后来一个总结吧:场景是A调用B,B抛出异常,A里面会捕获B的异常。
REQUIRED  +  REQUIRED   他们是同一个事务,所以对象bean是互通的(就是A修改了Student, B如果查询,是查到A修改后的Student),然后B抛异常影响了A,A也提交不了。
 
REQUIRED  +  NESTED      他们是同一个事务,所以对象bean是互通的,B抛异常不影响A(前提是要try), A最后可以提交事务
 
REQUIRED  + REQUIRES_NEW  他们是不同事务,所以对象bean不是互通的,B抛异常不影响A(前提是要try), A最后可以提交事务
 
 
 

Spring事务传递的更多相关文章

  1. Spring 事务传递教程_有实例

    通过这篇文章,你将学习到Spring框架中中事务的传递 简介 在处理Spring管理的事务时,开发人员可以以传播的方式定义事务的行为.换句话说,开发人员能够决定业务方法如何被封装在逻辑和物理事务中.来 ...

  2. spring 默认情况下事务是惟一的 同一个方法里面第一个sql开启后 在执行完 将事务传递给下一个sql

    spring 默认情况下事务是惟一的 同一个方法里面第一个sql开启后 在执行完 将事务传递给下一个sql

  3. 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】

    一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...

  4. spring事务管理器设计思想(二)

    上文见<spring事务管理器设计思想(一)> 对于第二个问题,涉及到事务的传播级别,定义如下: PROPAGATION_REQUIRED-- 如果当前没有事务,就新建一个事务.这是最常见 ...

  5. spring事务管理器设计思想(一)

    在最近做的一个项目里面,涉及到多数据源的操作,比较特殊的是,这多个数据库的表结构完全相同,由于我们使用的ibatis框架作为持久化层,为了防止每一个数据源都配置一套规则,所以重新实现了数据源,根据线程 ...

  6. spring事务源码研读1

    转载摘录自:Spring事务源码分析(一)Spring事务入门 有时为了保证一些操作要么都成功,要么都失败,这就需要事务来保证. 传统的jdbc事务如下: @Test public void test ...

  7. 【转】详解spring事务属性

    转载自:http://blog.chinaunix.net/u1/55983/showart_2091761.html 7个传播行为,4个隔离级别, Spring事务的传播行为和隔离级别[transa ...

  8. spring事务管理器设计思想(2)

    spring事务管理器设计思想(二) 上文见<spring事务管理器设计思想(一)> 对于第二个问题,涉及到事务的传播级别,定义如下: PROPAGATION_REQUIRED-- 如果当 ...

  9. Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别

    转: http://blog.csdn.net/it_man/article/details/5074371 Spring事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之 ...

随机推荐

  1. MySQL创建数据库与用户

    root远程访问授权 mysql> SHOW DATABASES; +--------------------+ | Database           | +---------------- ...

  2. 图的遍历——DFS(矩形空间)

    首先,这里的图不是指的我们一般所说的图结构,而是大小为M*N的矩形区域(也可以看成是一个矩阵).而关于矩形区域的遍历问题经常出现,如“寻找矩阵中的路径”.“找到矩形区域的某个特殊点”等等之类的题目,在 ...

  3. C#编程经验-enum and struct

    enum,store fixed values,use array replace,not use this data-structurestruct,store several variables, ...

  4. Ubuntu 14.10 下Hive配置

    1 系统环境 Ubuntu 14.10 JDK-7 Hadoop 2.6.0 2 安装步骤 2.1 下载Hive 我第一次安装的时候,下载的是Hive-1.2.1,配置好之后,总是报错 [ERROR] ...

  5. 知识点:Mysql 基本用法之视图

    视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的临时 ...

  6. denyhosts、中文文档乱码、端口占用查询

    1.安装 denyhosts, 设置 hosts.allow ,系统自动将攻击的ip 添加如 hosts.deny2.打开中文文档乱码, 将文档下载到windows, 通过富文本编辑器查看文档编码3. ...

  7. k8s学习笔记之一:kubernetes简介

    一.虚拟化技术 1.什么是虚拟化技术 虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机.在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立 ...

  8. OpenStack Q版本新功能以及各核心组件功能对比

    OpenStack Q版本已经发布了一段时间了.今天, 小编来总结一下OpenStack Q版本核心组件的各项主要新功能, 再来汇总一下最近2年来OpenStack N.O.P.Q各版本核心组件的主要 ...

  9. IntelliJ IDEA 导入多个maven项目

    IntelliJ IDEA的功能十分强大  我们日常开发项目会分多个maven项目 idea单个打开切换很是麻烦 下边是idea可以同时导入多个项目的方法 1.选择 FIle -> NEW -& ...

  10. Asp.Net+JQuery.Ajax之$.post

    段时间有点跑偏,经过米老师和师傅的耐心指导,终于认识到自己的问题,现在回归常规路线,继续B/S的学习. 经过近半个月的熏陶,对JQuery慢慢的有了亲切感.当时我采访过一清,问他看完JQuery视频有 ...