目录

编程式事务控制相关对象

编程式事务控制三大对象

基于XML的声明式事务控制

声明式事务控制的实现

使用注解配置声明式事务控制


编程式事务控制相关对象

编程式事务控制三大对象

1、PlatformTransactionManager

PlatformTransactionManager接口是spring 的事务管理器,它里面提供了我们常用的操作事务的方法。

注意:PlatformTransactionManager是接口类型,不同的 Dao层技术则有不同的实现类,例如:Dao层技术是jdbo或mybatis 时:org.springframework.jdbc.datasource.DataSourceTransactionManager
Dao层技术是hibernate时: org.springframework.orm.hibernate5.HibernateTransactionManager
2、TransactionDefinition

TransactionDefinition是事务的定义信息对象(参数 ),里面有如下方法:

 ①事物隔离级别

设置隔离级别,可以解决事务并发产生的问题,如脏读、不可重复读和虚读。

ISOLATION_DEFAULT
ISOLATION_READ_UNCOMMITTED
ISOLATION_READ_COMMITTED   
ISOLATION_REPEATABLE_READ
ISOLATION_SERIALIZABLE

②事物的传播行为【A——B】    
REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般的选择(默认值)
SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)
MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常
REQUERS_NEW:新建事务,如果当前在事务中,把当前事务挂起。
NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起NEVER:以非事务方式运行,如果当前存在事务,抛出异常
NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行REQUIRED
类似的操作
超时时间:默认值是-1,没有超时限制。如果有,以秒为单位进行设置
是否只读:建议查询时设置为只读

3、TransactionStatus

TransactionStatus接口提供的是事务具体的运行状态,方法介绍如下。

基于XML的声明式事务控制

 声明式事务控制是什么?
Spring的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明,就是指在配置文件中声明,用在Spring配置文件中声明式的处理事务来代替代码式的处理事务。
声明式事务处理的作用
①事务管理不侵入开发的组件。具体来说,业务逻辑对象就不会意识到正在事务管理之中,事实上也应该如此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,如果想要改变事务管理策划的话,也只需要在定义文件中重新配置即可
②在不需要事务管理的时候,只要在设定文件上修改一下,即可移去事务管理服务,无需改变代码重新编译,这样维护起来极其方便

注意: Spring声明式事务控制底层就是AOP。

声明式事务控制的实现

①引入tx命名空间

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
">

②配置事务增强

    <!--配置平台事务管理器--><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="*"/></tx:attributes></tx:advice>

③配置事务AOP织入

    <!--配置事务的aop织入--><aop:config><aop:pointcut id="txPointcut" expression="execution(* com.longdi.service.impl.*.*(..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/></aop:config>

④测试事务控制转账业务代码

    @Overridepublic void transfer(String outMan, String inMan, double money) {accountDao.out(outMan,money);int i = 1/0;accountDao.in(inMan,money);}

切点方法的事务参数配置

    <!--通知  事务的增强--><tx:advice id="txAdvice" transaction-manager="transactionManager"><!--设置事务的属性信息的--><tx:attributes><tx:method name="transfer" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/><tx:method name="save" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/><tx:method name="findAll" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true"/><tx:method name="update*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true"/><tx:method name="*"/></tx:attributes></tx:advice>

其中,<tx:method>代表切点方法的事务参数的配置,例如∶
<tx:method name= "transfer" isolation="REPEATABLE_READ" propagation="REQUIRED" timeout="-1"read-only="false" / >

name:切点方法名称
isolation:事务的隔离级别
propogation:事务的传播行为
timeout:超时时间
read-only:是否只读

使用注解配置声明式事务控制

1.编写AccoutDao

@Repository("accountDao")
public class AccountDaoImpl implements AccountDao {@Autowiredprivate JdbcTemplate jdbcTemplate;public void out(String outMan, double money) {jdbcTemplate.update("update account set money=money-? where name=?",money,outMan);}public void in(String inMan, double money) {jdbcTemplate.update("update account set money=money+? where name=?",money,inMan);}
}

2.编写AccountService

@Service("accountService")
@Transactional(isolation = Isolation.REPEATABLE_READ)
public class AccountServiceImpl implements AccountService {@Autowiredprivate AccountDao accountDao;@Transactional(isolation = Isolation.READ_COMMITTED,propagation = Propagation.REQUIRED)public void transfer(String outMan, String inMan, double money) {accountDao.out(outMan,money);int i = 1/0;accountDao.in(inMan,money);}//@Transactional(isolation = Isolation.DEFAULT)public void xxx(){}
}

3.编写applicationContext.xml配置文件

    <!一省略之前datsSource、jdbcTemplate、平台事务管理器的配置--><!--组件扫描--><context:component-scan base-package="com.longdi"/><!--事物的注解驱动--><tx:annotation-driven transaction-manager="transactionManager"/>

注解配置声明式事务控制解析

①使用@Transactional在需要进行事务控制的类或是方法上修饰,注解可用的属性同xml配置方式,例如隔离级别、传播行为等。
②注解使用在类上,那么该类下的所有方法都使用同一套注解参数配置。
③使用在方法上,不同的方法可以采用不同的事务参数配置。
④XML配置文件中要开启事务的注解驱动<tx :annotation-driven />

Spring(六)——声明式事物控制相关推荐

  1. Spring的声明式事务底层原理

    文章目录 声明式事务的概述 声明式事务的初探 声明式事务的源码分析 声明式事务的概述 Spring 的声明式事务管理在底层是建立在 AOP 的基础之上的.其本质是对方法前后进行拦截,然后在目标方法开始 ...

  2. 【Spring】spring基于注解的声明式事务控制

    结构 domin package com.itheima.domain;import java.io.Serializable;public class Account implements Seri ...

  3. 【spring】spring基于xml的声明式事务控制

    结构 domain package com.itheima.domain;import java.io.Serializable;public class Account implements Ser ...

  4. 【每日提高之声明式事物】spring声明式事务 同一类内方法调用事务失效

    2019独角兽企业重金招聘Python工程师标准>>> [问题] Spring的声明式事务,我想就不用多介绍了吧,一句话"自从用了Spring AOP啊,事务管理真轻松啊, ...

  5. spring基于注解的声明式事务控制

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  6. spring基于XML的声明式事务控制-配置步骤

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  7. 详细解读Spring2.5 +Struts1.3 框架(使用Spring声明式事物管理和springjjdbc模板)

    这个是我用Spring2.5 加Struts1.3搭建的一个web框架, 数据访问层使用springjdbc来访问数据库. 实现了SpringIOC容器维护bean和声明式事物管理. -------- ...

  8. Spring声明式事物配置管理

    Spring声明式事物配置管理 1.首先在applicationContext.xml添加以下内容: <!-- 配置事务管理器 --> <bean id="transact ...

  9. Spring的编程式事务声明式事务 基于注解的声明式事务控制

    文章目录 Spring中编程式事务 基于XML的声明式事务控制 基于注解的声明式事务控制 Spring集成web环境 Spring中编程式事务 Spring的事务控制可以分为编程式事务控制和声明式事务 ...

  10. 保护亿万数据安全,Spring有“声明式事务”绝招

    摘要:点外卖时,你只需考虑如何拼单:选择出行时,你只用想好目的地:手机支付时,你只需要保证余额充足.但你不知道这些智能的背后,是数以亿计的强大数据的支持,这就是数据库的力量.那么庞大数据的背后一定会牵 ...

最新文章

  1. jquery获得option的值和对option进行操作
  2. python网络爬虫实战 吕文翔_实战Python网络爬虫
  3. ubuntu16.04 配置nginx支持redis
  4. kafka新增节点时server.properties需要修改的地方
  5. TensorFlow第九步CNN BP算法学习
  6. vue-cli构建项目使用 less
  7. 如何绘制高大上的词云图?
  8. 【小程序案例】支付宝小程序-MQTT模器,IoT设备通过WSS接入阿里云IoT物联网平台...
  9. java抓取网页数据_Golang丨Java丨Python爬虫实战—Boss直聘网站数据抓取
  10. MPLS LDP邻居建立
  11. 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。(C++实现)
  12. Redhat 7.2 安装网卡驱动
  13. 商贸批发进销存管理软件,仓库条码管理,库存管理。采购入库单,供应商档案管理。
  14. 简化电脑操作,不让多余操作浪费你的生命
  15. LDAP未授权漏洞验证
  16. gitlab rpm包安装方法
  17. AES加密算法 Java与Python跨平台实现
  18. html特殊字符如何转义,Html特殊字符转义处理
  19. 人工智能相关名词解释(参考王万良教授《人工智能导论》以及网络博客)
  20. Spring注解讲解

热门文章

  1. win10开机桌面假死鼠标能动怎么办
  2. 微信公众号运营都有哪些渠道,来提升公众号的粉丝量
  3. 【Matlab】根据excel画折线图和柱状图
  4. 最后两星期,怎么过6级?(最快攻略)
  5. android netd firewall 分析,第2章 深入理解Netd
  6. bootstrap 可编辑列表,实现某个单元格动态控制是否可编辑状态
  7. Eclipse编辑器基本设置
  8. sql排序,null排在最前/最后----mysql排序之if(isnull(字段名),0,1),fild 或者 if(isnull(字段名),1,0),fild
  9. 163邮箱如何开启pop服务器端口,pop3端口号详情介绍
  10. 安卓一些错误经验积累