spring事务:

编程式事务(细粒度)

声明式事务(粗粒度,xml或者注解格式)

spring接口TransactionDefinition:

TransactionDefinition接口定义了事务传播行为 类型(7种),事务隔离类型(5种),超时设置等。

文档翻译:

定义Spring兼容事务属性的接口。 基于类似于EJB CMT属性的传播行为定义。
请注意,隔离级别和超时设置不会得到应用,除非实际的新事务开始。 只有PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW和PROPAGATION_NESTED可以导致这种情况,在其他情况下指定这些设置通常没有意义。 此外,请注意,并非所有事务管理器都支持这些高级功能,因此在给定非默认值时可能会引发相应的异常。
只读标志适用于任何事务上下文,无论是由实际资源事务支持还是在资源级别上以非事务方式操作。 在后一种情况下,该标志仅适用于应用程序内的托管资源,如Hibernate会话。

0、propagation_required

文档翻译:

支持当前事务; 如果不存在,则创建一个新的。 类似于同名的EJB事务属性。
这通常是事务定义的默认设置,通常定义事务同步范围。

1、propagation_supports

文档翻译:

支持当前事务; 如果不存在,则以非事务方式执行。 类似于同名的EJB事务属性。
注意:对于具有事务同步的事务管理器,PROPAGATION_SUPPORTS与完全没有事务稍有不同,因为它定义了同步可能适用的事务范围。 因此,相同的资源(JDBC连接,Hibernate会话等)将被共享给整个指定的范围。 请注意,确切的行为取决于事务管理器的实际同步配置!
一般来说,请小心使用PROPAGATION_SUPPORTS! 特别是,不要依赖PROPAGATION_SUPPORTS范围内的PROPAGATION_REQUIRED或PROPAGATION_REQUIRES_NEW(这可能会导致运行时出现同步冲突)。 如果这种嵌套是不可避免的,请确保正确配置事务管理器(通常切换到“实际事务同步”)。

2、propagation_mandatory

文档翻译:

支持当前事务; 如果没有当前事务存在,则抛出异常。 类似于同名的EJB事务属性。
请注意,PROPAGATION_MANDATORY范围内的事务同步将始终由周围事务驱动。

3、propagation_requires_new

文档翻译:

创建一个新的事务,如果存在,暂停当前事务。 类似于同名的EJB事务属性。
注意:实际的事务暂停将无法在所有事务管理器上直接使用。 这特别适用于org.springframework.transaction.jta.JtaTransactionManager,它要求使javax.transaction.TransactionManager可用(它是标准Java EE中的服务器特定的)。
PROPAGATION_REQUIRES_NEW范围始终定义自己的事务同步。 现有的同步将被暂停并恢复正常。

4、propagation_not_supported

文档翻译:

不支持当前事务; 而总是执行非事务性的。 类似于同名的EJB事务属性。
注意:实际的事务暂停将无法在所有事务管理器上直接使用。 这特别适用于org.springframework.transaction.jta.JtaTransactionManager,它要求使javax.transaction.TransactionManager可用(它是标准Java EE中的服务器特定的)。
请注意,事务同步在PROPAGATION_NOT_SUPPORTED范围内不可用。 现有的同步将被暂停并恢复正常。

5、propagation_never

文档翻译:

不支持当前事务; 如果当前事务存在,则抛出异常。 类似于同名的EJB事务属性。
请注意,事务同步在PROPAGATION_NEVER范围内不可用。

6、propagation_nested

文档翻译:

如果当前事务存在,则在嵌套事务内执行,其行为类似于PROPAGATION_REQUIRED 。 EJB中没有类似的功能。
注意:实际创建嵌套事务只适用于特定事务管理器。 开箱即用,这只适用于在处理JDBC 3.0驱动程序时使用JDBC org.springframework.jdbc.datasource.DataSourceTransactionManager。 一些JTA提供者也可能支持嵌套事务。

事务隔离等级:

什么是脏读?

a和b交易同时进行,a交易正在更新数据而未提交,b交易读取该数据,导致b交易可能获得不正确的数据

什么是幻读?

同一交易期间获取的记录数不一致。a第一次读取获得记录数是2,b增加了1,a再次读取获得记录数是3。

什么是不可重复读?

a交易两次读取同一个字段得到的数据不一致

【幻读和不可重复读的区别如下:】参考博客:https://blog.csdn.net/han1196639488/article/details/77442946

提醒: 
不可重复读的重点是修改,同样的条件,你读取过的数据,再次读取出来发现值不一样了 
幻读的重点在于新增或者删除,同样的条件,第 1 次和第 2 次读出来的记录数不一样

1、ISOLATION_DEFAULT = -1

文档翻译:

使用底层数据存储的默认隔离级别。 所有其他级别对应于JDBC隔离级别。

2、ISOLATION_READ_UNCOMMITTED = 1

文档翻译:

表示可能发生脏读,不可重复读和幻读。
这个级别允许一个事务改变的行被另一个事务读取,然后该行的任何改变被提交(“脏读”)。 如果任何更改回滚,则第二个事务将检索到无效行。

3、ISOLATION_READ_COMMITTED = 2

文档翻译:

指示防止脏读; 不可重复读取和幻像读取可能发生。
这个级别只禁止一个事务读取一行,并在其中有未提交的变化

4、ISOLATION_REPEATABLE_READ = 4

文档翻译:

指示防止脏读和不可重复读取; 幻读取可能会发生。
这个级别禁止一个事务读取一个没有提交变化的行,它也禁止如下情况:一个事务读取一行,
第二个事务改变行,第一个事务重新读取行,第二次获取不同的值(“不可重复读取”)。

5、ISOLATION_SERIALIZABLE = 8

文档翻译:

表示禁止脏读,不可重复读取和幻像读取。
该级别包括ISOLATION_REPEATABLE_READ中的禁止条件,并进一步禁止如下的情况:一个事务读取满足WHERE条件的所有行,第二个事务插入一条满足该WHERE条件的行,
并且第一个事务以这些相同的条件重新读取,在第二次读取中检索另外的“幻像”行。

spring事务xml配置:

     <!-- 事务管理器 -->
     <bean id="transactionManager"
         class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
         <!-- 数据源 -->
         <property name="dataSource" ref="dataSource" />
     </bean>
     <!-- 通知 -->
     <tx:advice id="txAdvice" transaction-manager="transactionManager">
         <tx:attributes>
             <!-- 传播行为 -->
             <tx:method name="save*" propagation="REQUIRED" />
             <tx:method name="insert*" propagation="REQUIRED" />
             <tx:method name="add*" propagation="REQUIRED" />
             <tx:method name="create*" propagation="REQUIRED" />
             <tx:method name="delete*" propagation="REQUIRED" />
             <tx:method name="update*" propagation="REQUIRED" />
             <tx:method name="find*" propagation="SUPPORTS" read-only="true" />
             <tx:method name="select*" propagation="SUPPORTS" read-only="true" />
             <tx:method name="get*" propagation="SUPPORTS" read-only="true" />
         </tx:attributes>
     </tx:advice>
     <!-- 切面 -->
     <aop:config>
         <aop:advisor advice-ref="txAdvice"
             pointcut="execution(* com.rui.service..*.*(..))" />
     </aop:config>

推荐:

https://www.cnblogs.com/softidea/p/5962612.html

https://blog.csdn.net/yuanlaishini2010/article/details/45792069

https://www.cnblogs.com/cxxjohnson/p/4923792.html

spring ----> 事务:传播机制和接口TransactionDefinition的更多相关文章

  1. spring事务传播机制实例讲解

    http://kingj.iteye.com/blog/1680350   spring事务传播机制实例讲解 博客分类:   spring java历险     天温习spring的事务处理机制,总结 ...

  2. Spring事务传播机制和数据库隔离级别

    Spring事务传播机制和数据库隔离级别 转载 2010年06月26日 10:52:00 标签: spring / 数据库 / exception / token / transactions / s ...

  3. spring 事务传播机制

    spring 事务 传播机制 描述的 事务方法直接相互调用,父子事物开启,挂起,回滚 等的处理方式. 绿色的 那几个 我认为比较重要. 1 , @Transactional(propagation=P ...

  4. Spring事务传播机制与隔离级别(转)

    Spring事务传播机制与隔离级别 博客分类: Spring   转自:http://blog.csdn.net/edward0830ly/article/details/7569954 (写的不错) ...

  5. 面试突击87:说一下 Spring 事务传播机制?

    Spring 事务传播机制是指,包含多个事务的方法在相互调用时,事务是如何在这些方法间传播的. 既然是"事务传播",所以事务的数量应该在两个或两个以上,Spring 事务传播机制的 ...

  6. Spring事务传播机制

    Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播,即协调已经有事务标识的方法之间的发生调用时的事务 ...

  7. 18个示例详解 Spring 事务传播机制(附测试源码)

    什么是事务传播机制 事务的传播机制,顾名思义就是多个事务方法之间调用,事务如何在这些方法之间传播. 举个例子,方法 A 是一个事务的方法,方法 A 执行的时候调用了方法 B,此时方法 B 有无事务以及 ...

  8. spring事务传播机制的测试结果

    /**     * @Component是个一般性的注解,使用此注解修饰的POJO类,有value属性,指定bean的id.也可不写.默认值是类名首字母小写     * @Resource是控制依赖注 ...

  9. spring事务传播机制与隔离级别、通知类别

    Spring在TransactionDefinition接口中规定了7种类型的事务传播行为, 它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播: 事务传播行为类型 说明 PROPAGATIO ...

随机推荐

  1. Codeforces Round #439 (Div. 2) Problem A (Codeforces 869A) - 暴力

    Rock... Paper! After Karen have found the deterministic winning (losing?) strategy for rock-paper-sc ...

  2. Codeforces 868D Huge Strings - 位运算 - 暴力

    You are given n strings s1, s2, ..., sn consisting of characters 0 and 1. m operations are performed ...

  3. Spring 学习——Spring常用注解——@Component、@Scope、@Repository、@Service、@Controller、@Required、@Autowired、@Qualifier、@Configuration、@ImportResource、@Value

    Bean管理注解实现 Classpath扫描与组件管理 类的自动检测与注册Bean 类的注解@Component.@Service等作用是将这个实例自动装配到Bean容器中管理 而类似于@Autowi ...

  4. Mysql的唯一性索引unique

    目录 唯一性索引unique影响: unique与primary key的区别: 存在唯一键冲突时,避免策略: insert ignore: replace into: insert on dupli ...

  5. 差分数组|小a的轰炸游戏-牛客317E

    小a的轰炸游戏 题目链接:https://ac.nowcoder.com/acm/contest/317/E 思路  这题考查的是对差分数组原理和前缀和的理解. 四个数组分别记录朝着四个方向下放的个数 ...

  6. Golang模拟客户端POST表单功能文件上传

    客户端通过multipart.Write把文件的文本流写入一个缓存中,然后调用http的Post方法把缓存传到服务器. package main import ( "bytes" ...

  7. Python之Requests的高级用法

    # 高级用法 本篇文档涵盖了Requests的一些更加高级的特性. ## 会话对象 会话对象让你能够跨请求保持某些参数.它也会在同一个Session实例发出的所有请求之间保持cookies. 会话对象 ...

  8. 【原理、命令】Git基本原理、与Svn的区别、命令

    一.Git是什么? Git是目前世界上最先进的分布式版本控制系统.工作原理 / 流程:Workspace:工作区Index / Stage:暂存区Repository:仓库区(或本地仓库)Remote ...

  9. Unity3D学习笔记(三十一):Xlua(1)

    Xlua:腾讯研发,开源免费   配置:文件解压,拷贝到Unity项目里 注意:Xlua文件夹不许移动,不许重命名   运行Xlua: 1.引用命名空间 2.创建虚拟机 3.运行lua语句 4.不需要 ...

  10. ORM之EF

    本文大部分内容截取自博客:  http://www.cnblogs.com/VolcanoCloud/p/4475119.html (一) 为什么用ORM 处理关系数据库时,我们依据由行和列组成的表, ...