Spring事务传递
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。无事务运行,如果你遇到一个方法
Spring事务传递的更多相关文章
- Spring 事务传递教程_有实例
通过这篇文章,你将学习到Spring框架中中事务的传递 简介 在处理Spring管理的事务时,开发人员可以以传播的方式定义事务的行为.换句话说,开发人员能够决定业务方法如何被封装在逻辑和物理事务中.来 ...
- spring 默认情况下事务是惟一的 同一个方法里面第一个sql开启后 在执行完 将事务传递给下一个sql
spring 默认情况下事务是惟一的 同一个方法里面第一个sql开启后 在执行完 将事务传递给下一个sql
- 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】
一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...
- spring事务管理器设计思想(二)
上文见<spring事务管理器设计思想(一)> 对于第二个问题,涉及到事务的传播级别,定义如下: PROPAGATION_REQUIRED-- 如果当前没有事务,就新建一个事务.这是最常见 ...
- spring事务管理器设计思想(一)
在最近做的一个项目里面,涉及到多数据源的操作,比较特殊的是,这多个数据库的表结构完全相同,由于我们使用的ibatis框架作为持久化层,为了防止每一个数据源都配置一套规则,所以重新实现了数据源,根据线程 ...
- spring事务源码研读1
转载摘录自:Spring事务源码分析(一)Spring事务入门 有时为了保证一些操作要么都成功,要么都失败,这就需要事务来保证. 传统的jdbc事务如下: @Test public void test ...
- 【转】详解spring事务属性
转载自:http://blog.chinaunix.net/u1/55983/showart_2091761.html 7个传播行为,4个隔离级别, Spring事务的传播行为和隔离级别[transa ...
- spring事务管理器设计思想(2)
spring事务管理器设计思想(二) 上文见<spring事务管理器设计思想(一)> 对于第二个问题,涉及到事务的传播级别,定义如下: PROPAGATION_REQUIRED-- 如果当 ...
- Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别
转: http://blog.csdn.net/it_man/article/details/5074371 Spring事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之 ...
随机推荐
- [UE4]Scroll Box带滚动条的容器
一.黑边,当可以往下滚动的时候,下边会出现黑边.当可以往上滚动的时候,上边也会出现黑边. Scroll Box.Style.Style:也可以自定义上下左右黑边的样式: 二.Scroll Box. ...
- ubuntu18.04 安装mysql server
mysql 5.7支持的最高版本是Ubuntu17 ,即使安装成功后,也会出现各种妖蛾子,本人就被这种问题困扰了好一会.在Ubuntu 18.04下安装mysql,建议安装8.0以上版本! 1. 配置 ...
- java为什么不能根据返回值重载?
我以前对Java中为什么不能根据返回值进行重载,而只能根据方法的参数进行重载非常不理解.比如void f(){}和int f(){},虽然他们有同样的名字,但是很容易区分.如果我这样做,肯定是没问题的 ...
- 用GDB调试程序(六)
七.设置显示选项 GDB中关于显示的选项比较多,这里我只例举大多数常用的选项. set print address set print address on 打开地址输出,当程 ...
- Java分割ID和姓名(String不能当输出参数)
ID:包括数字和字母 姓名:汉字 package org.ah; import org.ah.utils.Utils; public class Test { public static void m ...
- atnodes命令使用方法
一条命令可以同时执行多台机器,结果会输出列表. atnodes -L 'grep -c "查询订单列表,userId=bing.wang03" /home/w/www/order- ...
- oninput、onchange与onpropertychange事件的区别, 与input输入框实时检测
这几天项目着急,同时也学到好多以前没有接触过的知识.oninput.onchange与onpropertychange事件的区别, 与input输入框实时检测 onchange事件只在键盘或者鼠标操作 ...
- AlexNet实践
注释: CNN使用TF搭建比较简单,就像Hough检测使用CV很简单一样.但是怎么使用CNN去做一些实际操作,或者说怎么使用现有的方法进行慢慢改进,这是一个很大的问题! 直接跟着书本或者视频学习有点膨 ...
- window.open() 打开的子页面 往主页面传参问题
<!--主页面的代码--><!DOCTYPE html> <html> <head> <meta charset="utf-8" ...
- mysql数据库存中文字段
mysql数据默认编码是拉丁,而我们更多的使用utf8, 在创建库的时候执行参数即可: CREATE DATABASE IF NOT EXISTS yourdbname DEFAULT CHARSET ...