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. NOIP 2016 天天爱跑步 (luogu 1600 & uoj 261) - 线段树

    题目传送门 传送点I 传送点II 题目大意 (此题目不需要大意,我认为它已经很简洁了) 显然线段树合并(我也不知道哪来这么多显然) 考虑将每条路径拆成两条路径 s -> lca 和 t -> ...

  2. BottomNavigationBar 底部导航控件

    BottomNavigationBar 底部导航控件 属性 说明BottomNavigationBarItem 多个 item,iconSize icon大小currentIndex 默认选中第几个o ...

  3. P2057 [SHOI2007]善意的投票

    思路 简单的最小割模型 最小割的模型就是选出一些边,把点集划分成S和T两个部分,使得代价最小 到这题上就是板子了 代码 #include <cstdio> #include <alg ...

  4. p3302 [SDOI2013]森林(树上主席树+启发式合并)

    对着题目yy了一天加上看了一中午题解,终于搞明白了我太弱了 连边就是合并线段树,把小的集合合并到大的上,可以保证规模至少增加一半,复杂度可以是\(O(logn)\) 合并的时候暴力dfs修改倍增数组和 ...

  5. BZOJ 4399 魔法少女LJJ(线段树合并)

    题意 https://www.lydsy.com/JudgeOnline/problem.php?id=4399 思路 码农题,需要一定代码功底.方法很暴力,先将权值离散,表示在线段树里储存的位置,每 ...

  6. Google advertiser api开发概述

    对象.方法和服务 AdWords API 主要供 AdWords 的高级用户使用.如果您是 AdWords 新手,或需要复习 AdWords 基本概念,请查看 AdWords 基础知识页面. 对象层级 ...

  7. eclipse安装spring boot插件spring tool suite

    进行spring cloud的学习,要安装spring boot 的spring -tool-suite插件,我在第一次安装时,由于操作不当,两天才完全安装好,真的是要命了,感觉自己蠢死!下面就自己踩 ...

  8. js中属性点.和中括号[]的关系。

    本来这里说的是 js 执行一个字符串形式函数的方法. 但是呢看到一个 window['test'] ,居然一下子转不过弯来.这就尴尬了. 不是说好了 [] 和 . 其他都是 “什么的什么” 关系吗?如 ...

  9. springmvc通过ajax异步请求返回json格式数据

    jsp 首先创建index.jsp页面 <script type="text/javascript"> $(function () { $("#usernam ...

  10. vs项目的属性页面总结

    本文主要针对vs中属性页面的相关选项含义进行了总结.