为了账号安全,请及时绑定邮箱和手机立即绑定
  • Spring事务管理课程:


    查看全部
  • spring事务管理高层抽象主要包括3个接口

    1. PlatformTransactionManager (事务管理器)

    2. TransactionDefinition (事务定义信息(隔离,传播,超时,只读))

    3. TransactionStatus (事务具体运行状态)

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

    2019-09-08

  • log4文件:https://www.imooc.com/qadetail/303285

    java.lang.IllegalStateException: Failed to load ApplicationContext解决方法:https://www.imooc.com/qadetail/189429


    查看全部
  • Spring事务管理的两种方式

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

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


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

    【a】创建表及插入记录

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

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

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

    【f】spring配置文件编写


    查看全部
  • TransactionStatus接口介绍

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


    查看全部
  • 服务器端分为三层:web层,业务层和持久层。

    事务加在业务层。


    TransactionDefinition定义事务传播行为

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

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

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

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

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

    查看全部
  • 事务的定义:

    事务指的是逻辑上的一组操作,这组操作要么全部成功,要么全部失败。

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

    原子性:事务是一个不可分割的工作单位(其中的操作不能单独运行),事务中的操作要么都发生,要么都不发生。

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

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

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


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

    2019-08-17

  • 课程目标

    -Spring事务管理的一组API

    -Spring的编程式事务管理

    -Spring的声明式事务管理


    查看全部
  • 事务管理的两种方式

    查看全部
  • 事务传播行为

    查看全部
  • Spring将事物管理分成了两类:

    【1】编程式事务管理:手动编写代码进行事物管理(很少使用)

    【2】声明式事务管理:

    基于TransactionProxyFactoryBean的方式(很少使用)

    ——需要为每个进行事务管理的类,配置一个代理类,后期维护和管理不方便。

    基于AspectJ的XML方式(经常使用)

    ——可以清晰的在XML配置文件中,查看到哪些类哪些方法应用事物管理,业务层上不需要添加任何东西。

    基于注解方式(经常使用)

    ——使用简单,需要为每一个需要事务管理的业务层上添加注解@Transactional。

    查看全部
    0 采集 收起 来源:课程总结

    2019-08-14

  • 声明式事务管理方式三:基于注解的方式

    加载测试环境:Spring提供的,@RunWith(SpringJUnit4ClassRunner.class),只有加载它了,才可以使用@Test注解

    加载配置文件:@ContextConfiguration(classpath:相对路径)。

    【1】配置事物管理器

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

    【2】开启注解事物

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

    【3】添加注解@Transactional(哪个类上需要事物管理就在哪个类上添加注解)

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

    该注解中也包含一些属性(传播行为、隔离级别、超时、异常),如果不写,都会按默认值来处理。

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

    查看全部
  • 声明式事物管理方式二:基于AspectJ的XML方式

    实际开发中,不经常使用第一种方式(TransactionProxyFactoryBean代理类),因为这种方式需要为每一个需要事务管理的Service配置一个TransactionProxyFactoryBean,开发和维护带来不便。

    【1】引入AspectJ的jar包和整合AspectJ的包。

    AspectJ简介:Spring在开发AOP时,为了简化编程而建立的。(AspectJ实际是开源的、第三方的AOP开发框架,Spring为简化自身开发,就引入了AspectJ的包)

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

    【2】配置事物管理器,并注入数据源dataSource。

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

    【3】配置事物的通知(事物的增强,通过<tx:advice id=""  transaction-manager="事物管理器Id"></tx:advice>,这个标签中需要配置事物相关的一些属性<tx:attributes></tx:attributes>,该属性的作用就是哪些方法执行事务,<tx:method="方法名"></tx:method>如果多个方法可以用英文单词*,该标签中还定义了事物的传播行为、隔离级别、超时信息、只读等等属性)

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

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

    事物增强的一些属性信息。


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

    【4】配置AOP的切面(通过<aop:config></aop:config>,在<aop:config>下需要配置切入点<aop:point-cut expression="" id=""></aop:point-cut>,其中表达式最前面的*表示方法返回值为任意的,+号表示及其子类,.*表示任意的方法,(..)表示任意的参数,接下来需要配置切面其中<aop:aspect>代表多个切入点,多个通知,而<aop:advisor>是一个切入点,一个通知的。这里使用它即可。因为现在只有一个增强即事物增强,这样AccountService即其子类的任意方法都会事物增强了)


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


    该声明式事务管理就不需要再注入代理了,这种方式属于自动代理,自动代理一般是基于BeanPostProcessor这个类,也就是类生成过程中(Serivice)本身就是一个代理。



    查看全部
  • 基于TransactionProxyFactoryBean实现声明式事物管理:基于AOP来实现事物管理功能(也就是在执行Dao中方法前后做一些操作)。

    【1】引入AOP的jar包。

    【2】配置事物管理器。

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

    【3】实现事务管理可以为Service提供一个代理类,该代理类可以对Service方法进行增强。这里在配置文件中使用Spring传统的AOP方式配置代理类。

    Spring传统的事务管理的操作中,提供了一个事物代理的工厂类TransactionProxyFactoryBean,它就可以为某一个Service产生代理对象。其中该事物代理工厂需要注入一个属性,该属性就是目标对象。接下来就会产生代理对象,产生的代理对象还需要事务管理,所以还需注入事务管理器。

    要想事物管理还需要一些定义信息例如:隔离级别、传播行为。所以还需要注入一些事物属性,通过TransactionProxyFactoryBean源码可知,该事物属性该怎样配置,如图2。为何这样配置,可以找到setTransactionAttributes方法,该方法参数是Properties类型。

    通过源码可知key的值为insert开头的任意方法就使用PROPAGATION_REQUIRED传播行为,其他同理。

    prop的格式:

    PROPAGATION:事物的传播行为。

    ISOLATION:事物的隔离级别。

    readOnly:只读。

    -Exception:发生哪些异常回滚事物(默认情况下发生任何异常都会回滚事物)。

    +Exception:发生哪些异常事物不会滚,仍然提交事物。

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

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

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

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

    首先需要配置传播行为,传播行为必须要配置。这里配置PROPAGATION_REQUIRDE传播行为,它是保证业务层之间方法相互调用时在同一个事物中。

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

    业务层无需改动,因为该方式事务管理是AOP方式实现,但是测试这里需要改动需要注入代理类,AccountServiceImpl是没有增强的类,而accountServiceProxy才是对AccountServiceImpl增强以后的类,它才具备事物处理的功能。,所以测试类需要注入accountServiceProxy,这是就可以进行实物管理了。

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

    当事物设置成readOnly就不进行修改、删除、插入操作了。如果这情况下设置成readOnly就会发生错误。

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

    如果使用+Exception,会发生事物仍然会提交,但不会回滚,该情况也就是钱仍然会被转丢。

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


    查看全部
  • 编程式事务管理

    Spring为简化编写代码,提供了事务管理模板TransactionTemplate,TransactionTemplate依赖DataSourceTransactionManager(使用SpirngJDBC时事务的管理类,它是PlatformTransactionManager接口的实现类),DataSourceTransactionManager依赖DataSource(例如service需要使用事务,只需要在service中注入改模板即可,JDBC是通过Connection对象来对事务进行管理,而SpringJDBC配置事务时也需要这样的对象进行管理,这里是在配置事务管理器DataSourceTransactionManager的bean标签里来注入连接池实现的,如图)。

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

    配置事务管理器

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

    配置事务管理器模板

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

    编程式事务管理就是在需要使用事务的地方手动编写代码,所以需要在Service层里注入该模板,这时Service调用Dao中的两个方法就处于同一个事务中了。

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

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

    通过模板的方法就可以实现业务回滚,execute(TransactionCallBack<T> transactionCallBack),TransactionCallBack实际是一个接口,可以手动创建一个类实现给接口,在传入该对象。也可以使用匿名内部类的形式,匿名内部类的方法里就可以进行事务的操作了,该方法里的参数是事务的状态对象,而且一个方法里的参数中匿名内部类想使用外部传入的参数,需要使用final修饰该参数。如下图

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





    查看全部

举报

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

微信扫码,参与3人拼团

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

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