就我接触到的事务,使用最多的事务管理器是JDBC事务管理器。现在就记录下在spring中是如何使用JDBC事务管理器

1)在spring中配置事务管理器

  1. <!-- JDBC事务 -->
  2.     <bean id="jdbcTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  3.         <property name="dataSource" ref="datasource"></property>
  4.     </bean>

为啥要为DataSourceTransactionManager类装配dataSource Bean? 这是因为DataSourceTransactionManager是调用java.sql.Connection来管理事务的。Connection是通过DataSource获取到的。通过调用Connection.commit()来提交事务;调用Connection.rollback()来回滚事务。所以需要装配DataSource这个Bean.

2)了解事务的五边形:传播行为、隔离级别、只读、事务超时、事务规则

声明事务的时候,需要指明方法是否要在事务环境中运行,事务的隔离级别等等,要先了解事务的五边形:

以下是事务的五边形整理:

传播行为

Propagation_mandatory

表示方法必须在事务中运行,若事务不存在,则抛出一个异常

Propagation_nested

若当前存在一个事务,则方法会在嵌套事务中运行,如果不存在,则与propagation_required一样

Propagation_never

方法不运行在事务环境中,若存在当前事务,则抛出异常

Propagation_not_supports

方法不应该运行在事务中,若存在当前事务,方法运行时,当前事务将被挂起

Propagation_required

方法必须运行在事务中,若没有事务,则会启动一个新的事务

Propagation_required_new

方法必须运行在它自己事务中,方法运行时,若存在当前事务,事务被挂起,同时会启动一个新的事务

Propagation_supports

方法不需要事务上下文,但存在当前事务,会在事务中运行

隔离级别

Isolation_read_uncommitted

允许读取未提交的数据,会导致脏读,不可重复读,幻读

Isolation_read_committed

允许读取并发事务提交的数据。如:事务A在运行时,第一次读取到a,此时并发事务B更新了数据,然后事务A第二次读取到b,导致a与b不一样。因此可阻止脏读,可导致不可重复读,幻读

Isolation_repeatable_read

对同一字段的多次读取是一样的,除非数据是本事务修改。这样能够防止不可重复读出现;当事务A运行时,读取几行数据后,并发事务B此时插入了一些数据,此时事务A继续读取,这样A读取的数据多了一些原本不存在的记录。因此可阻止脏读,不可重复读,可导致幻读

Isolation_serializable

完全锁定事务相关表,可阻止脏读,不可重复读,幻读

只读

read_only

若对db只做读操作;可将事务声明为只读,这样db可进行只读优化;当事务启动时,若该事务声明为只读,会通知db实施只读优化;因此需要传播行为可能具有新启动事务才能有效

事务超时

超时时钟会在事务启动时开始,因此只有具备可能可动事务的传播行为才有效

回滚规则

默认情况下,事务在检查型异常时是不会回滚,只有在运行期异常才会回滚;通过设置回滚规则,可声明事务在遇到特定的异常不回滚,即使是在运行期。

3)在xml中声明事务

① 使用<tx:advice> 声明一个事务性策略AOP通知

  1. <!-- 添加事务通知 -->
  2.     <tx:advice id="txAdvice" transaction-manager="jdbcTransactionManager">
  3.         <tx:attributes>
  4.             <tx:method name="save*" propagation="REQUIRED"/>
  5.             <tx:method name="*" propagation="SUPPORTS" read-only="true"/>
  6.         </tx:attributes>
  7.     </tx:advice>

以上通知表示:以save开头的方法必须运行在事务中。其他方法的运行不需要事务上下文存在,如果存在当前事务,则会在事务中运行。且声明为只读,这样当方法运行时启动一个新事务进行的是读操作, 可让db实施只读优化;

②现在只声明的是一个AOP通知,并没有指明哪些Bean是需要配置事务的。所以需要一个切点

  1. <!-- 定义AOP事务通知器,在哪些Bean上使用事务 -->
  2.     <aop:config>
  3.         <aop:advisor advice-ref="txAdvice" pointcut="execusion(* com.test.demo.dao.impl.*.*(..))"/>
  4.     </aop:config>

4)使用注解驱动的事务

相比在xml中声明事务,使用注解驱动的事务更加简洁:

  1. <tx:annotation-driven transaction-manager="jdbcTransactionManager"/>

<tx:annotation-driven>会告诉spring在spring上下文中查找使用了@Transctional注解的Bean,不管这注解是在类级别上还是方法上。对于每个使用了@Transactional注解的Bean,<tx:annotation-driven>会自动为它添加事务通知。

  1. @Transactional(propagation=Propagation.SUPPORTS,readOnly=true)
  2. public class UserDaoAnn implements UserDao {
  3.  
  4.     @Transactional(propagation=Propagation.REQUIRED,readOnly=false)
  5.     public void addUser(Monkey Monkey) {
  6.         // TODO Auto-generated method stub
  7.  
  8.     }
  9.  
  10. }

类UserDaoAnn,类级别上使用了@Transactional(propagation=Propagation.SUPPORTS,readOnly=true),表示方法不需要运行在事务上下文中,并为事务声明为只读

方法级别上addUser,使用了@Transactional(propagation=Propagation.REQUIRED,readOnly=false),表示方法必须运行在事务中

spring与事务管理的更多相关文章

  1. Spring的事务管理

    事务 事务:是逻辑上一组操作,要么全都成功,要么全都失败. 事务特性(ACID) 原子性:事务不可分割 一致性:事务执行的前后,数据完整性保持一致 隔离性:一个事务执行的时候,不应该受到其他事务的打扰 ...

  2. spring笔记--事务管理之声明式事务

    事务简介: 事务管理是企业级应用开发中必不可少的技术,主要用来确保数据的完整性和一致性, 事务:就是一系列动作,它们被当作一个独立的工作单元,这些动作要么全部完成,要么全部不起作用. Spring中使 ...

  3. Spring应用——事务管理

    事务基础:请参看:http://www.cnblogs.com/solverpeng/p/5720306.html 一.Spring 事务管理 1.前提:事务管理器 在使用 Spring 声明式事务管 ...

  4. spring+mybatis事务管理

    spring+mybatis事务管理 最近在和朋友做一个项目,考虑用springmvc+mybatis来做,之前在公司工作吧,对于数据库这块的配置也有人再弄,最近因为这个项目,我就上网学习了一些关于数 ...

  5. spring,mybatis事务管理配置与@Transactional注解使用[转]

    spring,mybatis事务管理配置与@Transactional注解使用[转] spring,mybatis事务管理配置与@Transactional注解使用 概述事务管理对于企业应用来说是至关 ...

  6. Spring高级事务管理难点剖析

    1Spring事务传播行为 所谓事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播.Spring支持7种事务传播行为 PROPAGATION_REQUIRED(加入已有事务) 如果当前没 ...

  7. CSDN上看到的一篇有关Spring JDBC事务管理的文章(内容比较全) (转)

    JDBC事务管理 Spring提供编程式的事务管理(Programmatic transaction manage- ment)与声明式的事务管理(Declarative transaction ma ...

  8. Spring之事务管理

        事务管理对于企业应用至关重要.它保证了用户的每一次操作都是可靠的,即便出现了异常的访问情况,也不至于破坏后台数据的完整性.     就像银行的自助取款机,通常都能正常为客户服务,但是也难免遇到 ...

  9. Mybatis整合Spring实现事务管理的源码分析

    一:前言 没有完整看完,但是看到了一些关键的地方,这里做个记录,过程会有点乱,以后逐渐补充最终归档为完整流程:相信看过框架源码的都知道过程中无法完全确定是怎样的流程,毕竟不可能全部都去测试一遍 ,但是 ...

  10. Hibernate与Spring的事务管理

    什么是事务 这个问题比较大,按照我的理解就是,一个事务内的n个操作,要么全部完成,一旦有一个操作有问题,那么所有的操作都全部回滚. Jdbc的事务 首先,大家已经知道了,事务说白了就是一个词----统 ...

随机推荐

  1. urllib、requests库整理

  2. vscode设置让鼠标滚动改变字体大小

    打开settings.json文件 输入"editor.mouseWheelZoom": true, 这样比较方面,比默认的放大缩小来的快捷

  3. 新游发布:《Don't touch the color》

    这是笨猫工作室最后一个Scratch 2.0游戏,经过笨猫工作室成员的不懈努力,游戏终于可以稳定运行.此次更新添加了最高分数显示,优化了系统流畅度.快来试玩吧!!! 卡搭蓝链:https://kada ...

  4. cyg-apt update 升级报错

    现象: $ cyg-apt updatecyg-apt: downloading: http://box-soft.com/setup-2.bz2cyg-apt: downloading: http: ...

  5. 3224: Tyvj 1728 普通平衡树(新板子)

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 17048  Solved: 7429[Submit][St ...

  6. 装饰器与lambda

    装饰器 实际上理解装饰器的作用很简单,在看core python相关章节的时候大概就是这种感觉.只是在实际应用的时候,发现自己很难靠直觉决定如何使用装饰器,特别是带参数的装饰器,于是摊开来思考了一番, ...

  7. 学习正则有感by魔芋(命名问题)

    魔芋: 事实上,我是反感一些特殊的名词.一些名词看上去就让人感觉到抗拒. 关于一个概念用不同的名词来定义,简直是太糟糕了. 举个例子: 匹配一个后面带有exp2的exp1的正则. 写法: exp1(? ...

  8. 【Codeforces Round #476 (Div. 2) [Thanks, Telegram!] C】Greedy Arkady

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举那个人收到了几次糖i. 最好的情况显然是其他人都只收到i-1次糖. 然后这个人刚好多收了一次糖 也即 (i-1)kx + x & ...

  9. rocketmq源码分析2-broker的消息接收

    broker消息接收,假设接收的是一个普通消息(即没有事务),此处分析也只分析master上动作逻辑,不涉及ha. 1. 如何找到消息接收处理入口 可以通过broker的监听端口10911顺藤摸瓜式的 ...

  10. Sonar - 部署常见问题及解决方法

    1. sonarqube启动报错,查看es.log如下: 问题原因:sonarqube不能使用root用户启动 解决方法: (1)更改sonarqube所属用户权限 chown -R gold:gol ...