为了账号安全,请及时绑定邮箱和手机立即绑定
  • Spring事务管理的两种方式

    【1】编程式的事务管理:手动在程序中编写代码实现事务管理,实际应用中很少使用,通过TransactionTemplate管理事务。

    【2】声明式的事务管理:使用XML配置实现事务管理,推荐使用(代码侵入性最小),Spring的声明式事务管理是通过AOP实现的(没有代码之前开启事务,代码完成后提交事务)。

    搭建事务管理环境(模拟转账环境)

    【a】创建表及插入记录

    【b】创建项目并引入jar包

    【c】引入log4j.properties、applicationContext.xml、jdbc.properties配置文件。

    【e】创建包结构,编写Dao及Service

    【f】spring配置文件编写

    https://img1.sycdn.imooc.com//5d4e32dd0001de4411810401.jpg

    【g】Dao中获取JDBC模板

    首先Dao实现类需要继承JdbcDaoSupport类,该类中就会注入JDBC模板,该类中定义了JDBC模板,并提供set方法只要Dao中注入模板就可以

    。也可以通过注入连接池获取JDBC模板。


    https://img1.sycdn.imooc.com//5d4e33990001990906490150.jpg

    https://img1.sycdn.imooc.com//5d4e33990001d0bd06620136.jpg

    https://img1.sycdn.imooc.com//5d4e33990001d57207740174.jpg



    【h】Dao方法具体编写

    https://img1.sycdn.imooc.com//5d4e35dc0001bd1c07430391.jpg


    【i】Service中注入Dao,并调用Dao中的方法

    【k】测试:由于Junit4和spring整合的包已经引入,所以通过注解@ContextConfiguration注解加载配置文件,这里使用注解@Resource(name="")方式注入AccountService。

    https://img1.sycdn.imooc.com//5d4e389e0001bb0b06250284.jpg


    查看全部
  • TransactionStatus接口介绍

    TransactionStatus接口:提供了获取事务状态的方法(例如:hasSavepoint()事务是否有保存点,isCompleted()事务是否已经完成,isNewTransaction()是否是新的事务)。

    https://img1.sycdn.imooc.com//5d4cd5e00001245811170405.jpg

    查看全部
  • TransactionDefinition定义事务传播行为

    事务的传播行为:解决业务层方法之间相互调用的问题(一个service层里的方法调用另一个service里中的方法,这两个service中又分属于两个不同的事务,传播行为就是为了解决方法调用时事务的传递)。

    https://img3.sycdn.imooc.com/5d4cca4a000114b309750466.jpg

    事务的传播行为有7种,可以为3类:

    第一类为前三个,重点掌握第一个(在相同事务里):支持当前事务(Service中bbb()调用Service中aaa()方法时,如果aaa()有事务,则使用该事务。如果没有事务,则使用bbb()当前事务,如果当前bbb()也没有事务,就会新创建一个事务)

    第二类为接下来三个,重点掌握第一个(在不同事务中):如果aaa()有事务存在,挂起当前事务,创建一个新的事务(aaa()和bbb()不在一个事务中)。

    第三类:如果当前事务存在,则嵌套事务执行(执行aaa()完后,会使用事务的保存点,在执行bbb()时如果发生异常,可以回滚到设置的保存点,也可以回滚到最初始的状态)。

    https://img2.sycdn.imooc.com/5d4cc9e70001965a10890480.jpg



    查看全部
  • TransactionDefinition定义事务隔离级别

    TransactionDefinition接口:通过Spring的API可以知道该接口提供了一组常量。

    如下图以ISOLATION开头的五个隔离级别。

    https://img1.sycdn.imooc.com//5d4cbdfd00015b9608880269.jpg

    如下图以PROPAGATION_MANDATORY开头的7个传播行为。

    https://img1.sycdn.imooc.com//5d4cbe750001ada909550314.jpg

    如下图以TIMEOUT开头的超时信息

    https://img1.sycdn.imooc.com//5d4cbee30001453709910070.jpg

    该接口还提供了一些方法,例如:获得隔离级别、获得超时信息、获得是否只是只读的等。

    https://img1.sycdn.imooc.com//5d4cbf2d000129a906640304.jpg

    如果不考虑隔离性,就会引发安全问题:脏读、不可重复读、以及虚读或者叫做幻读。

    脏读:一个事务读取了另一个事务改写但还未提交的数据,如果这些数据被回滚,则读到的数据是无效的。

    不可重复读:同一事务中,多次读取同一数据返回的结果有所不同(读取到另一个事务已经提交的更新的数据)。

    幻读:一个事务读取了几行记录后,另一个事务插入一些记录,幻读就发生了。再后来的查询中,第一个事务就会发现有些原来没有的记录。

    正常情况下,数据库提供了四种隔离级别:

    READ_UNCOMMITED:安全级别最低,如果设置为该级别,就可能会发生脏读、不可重复读、幻读等。

    READ_COMMITED:如果设置该级别,可以避免脏读的发生,但是可能会发生不可重复读和幻读。

    REPEATABLE_READ:如果设置该级别,可以避免脏读和不可重复读,但是可能会发生幻读。

    SERIALIZABLE:事务是串行的,不会发生并发访问这种情况

    https://img1.sycdn.imooc.com//5d4cc2f200014e7611010367.jpg

    Spring提供了DEFAULT,它代表使用数据库默认的隔离级别(例如:Mysql默认采用REPEATABLE_READ隔离级别,Oracle默认采用READ_COMMITTED隔离级别)。

    查看全部
  • PlatformTransactionManager接口介绍:

    通过Spring的API可以知道该接口有许多实现类例如:DataSourceTransactionManager、HibernateTransactionManager等。Spring会为不同的持久化框架提供了不同PlatformTransactionManager接口实现。

    https://img1.sycdn.imooc.com//5d4c247900011d9d11210267.jpg

    比如当我们使用SpringJDBC或者iBatis进行持久化数据时使用DataSourceTransactionManager。

    https://img1.sycdn.imooc.com//5d4c251e0001e25a10700304.jpg

    通常我们使用的是DataSourceTransactionManager和HibernateTransactionManager。


    查看全部
  • Spring中的事务管理:Spring提供了一组接口进行事务的管理。

    Spring提供事务管理的3个接口:

    【1】PlatformTransactionManager:事务管理器,用来管理事务的接口,定义了事务的提交、回滚等方法。

    https://img1.sycdn.imooc.com//5d4c1da70001103a05410115.jpg

    【2】TransactionDefinition:事务定义信息(隔离级别、传播行为、是否超时、是否只读)

    https://img1.sycdn.imooc.com//5d4c1dae0001d67104360413.jpg

    【3】TransactionStatus:事务具体运行状态(事务是否提交,事务是否有保存点,事务是否是新事物等状态)。

    https://img1.sycdn.imooc.com//5d4c1db60001b0a603850196.jpg


    Spring事务管理时,这三个接口是有联系的,Spring首先会根据事务定义信息TransactionDefinition获取信息,然后由事务管理器PlatformTransactionManager进行管理,在事务管理过程中,会产生一个事务的状态,这个状态就保存在事务具体运行状态TransactionStatus中了。

    查看全部
    0 采集 收起 来源:接口介绍

    2019-08-08

  • 事务的基本概念:事务指的是逻辑上的一组操作,这组操作要么全部成功,要么全部失败。

    事务的特性:原子性、一致性、隔离性、持久性。

    原子性:事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

    一致性:事务前后数据的完整性必须保持一致。

    隔离性:多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要相互隔离(数据库中相应的数据隔离级别,通过它避免事务间的冲突)。

    持久性:一个事务一旦被提交,它对数据库中数据的改变是永久性的,即使数据库发生故障也不应该对其有任何影响。

    查看全部
    0 采集 收起 来源:事务回顾

    2019-08-08

  • 在需要使用事务的业务实现类前添加 @Transactional 注解,便可引入到事务管理中,同时事务的传播行为、隔离级别等都存在于@Transactional 注解的属性中,根据需求声明赋值便可!

    查看全部
  • 声明式事务管理中,基于注解的方式实现:

    默认需要配置 org.springframeword.jdbc.datasource.DataSourceTransactionManager 外;

    只需要添加开启注解事务的配置即可:

    <tx:annotatioon-drivern transaction-manager="transactionManager">


    查看全部
  • 此处业务层的代理 的配置 基于  TransactionProxyFactoryBean 类进行了增强操作,主要操作,通过配置目标对象,将事务管理器注入并配置响应的事务属性,在 <property><props></props></property>中配置实际需要增强的功能,即事务的传播行为;隔离级别只读,异常回滚处理等....

    注意: 业务功能增强是在本配置中实现,通过配置目标对象<property name="target" ref="accountService">将业务接口引入,并在当前配置中做增强;因此真正具有增强功能的 是  "accountServiceProxy" 这个类,在引入 业务接口时需要通过 @Resource 引入 "accountServiceProxy"


    查看全部
  • 此处的accountService类没有被增强过;实际增强的类是配置业务层的的代理中的 “id= accountServiceProxy”类<br/>
    查看全部
  • 本方法需要在业务接口上注入代理类,如图中, @Resource(name="accountServicceProxy")

    private AccountService accountService;

    查看全部
  • 声明式事务管理中,基于TransactionProxyFactoryBean的XML方式实现:

    默认需要配置 org.springframeword.jdbc.datasource.DataSourceTransactionManager 外;

    还要配置具体的业务层的代理,即事务代理的主要项:

    org.springframeword.transaction.interceptor.TransactionProxyFactoryBean


    查看全部
  • 事务的通知中,可以增强的具体内容有以下几点:

    事务传播行为;

    事务隔离级别;

    只读;

    发生哪些异常回滚;

    发生哪些异常不回滚

    查看全部
  • 使用aop:config配置切入点,使用aop:pointcut   的 id 作为切入点的 坐标;调用 aop:advisor 配置切面,引入事务的增强  -- "txAdvice",将其指向要生效的切入点 -- "pointcut1";当excution 中对应的方法被调用时,该切入点会被配置的事务进行增强
    查看全部

举报

0/150
提交
取消
课程须知
学习本课程前需要熟悉Spring的基础知识,掌握IOC和AOP的基本概念。小伙伴们可参考《Spring入门》课程
老师告诉你能学到什么?
1、理解Spring事务管理的基本概念 2、掌握Spring事务管理的应用场景 3、掌握声明式事务管理和编程式事务管理的实现方式

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!