原文参考:spring事务

事务的定义

事务是指多个操作单元组成的集合,多个单元操作时整体不可分割的,要么都操作成功,要么都不成功.事务必须遵循四个原则(ACID)
1.原子性(Atomicity):即事务是个不可分割的最小单原,事务内操作要么全做,要么全不做
2.一致性(Consistency):在事务执行前数据库处于正确的状态,而事务执行完成后数据库的数据还是应该处于正确的状态,即数据完整性约束没有被破坏;
3.隔离性(Isolation):并发事务执行之间互不影响,在一个事务内部的操作对其他事务是不产生影响,这需要事务隔离级别来指定隔离性;
4.持久性(Durability):事务一旦执行成功,它对数据库的数据的改变必须是永久的,不会因为系统故障或断电而造成数据不一致或丢失;

事务的分类

1.数据库分为本地事务跟全局事务
1.本地事务:普通事务,独立一个数据库,能保证在该数据库上操作的ACID。
2.分布式事务:涉及两个或多个数据源的事务,即跨越多台同类或异类数据库的事务,分布式事务旨在保证这些本地事务的所有操作的ACID,使事务可以跨越多台数据库;
2.Java事务类型分为JDBC事务和JTA事务
1.JDBC事务:即为上面说的本地事务,通过connection对象控制管理;
2.JTA事务:JTA指Java事务API(Java Transaction API),是JavaEE数据库事务规范,JTA只提供了事务管理接口,由应用程序服务器厂商提供实现,JTA事务比JDBC更强大,支持分布式事务;

事务的隔离级别

理解事务隔离级别需要结合实例先理解几个概念
在实际项目中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对同一数据进行操作).那么可能会导致出现如下问题
1.脏读
假设事务A执行insert(user),插入操作,但是还没来得及提交;事务B执行查询,如果事务之间没有有效隔离,此时事务B就会读出还未提交的user,这就是脏读。
2.不可重复度
假设事务A访问数据库,select Name from User where Id =1 查到id=1的用户了,这时,事务B来了,对id=1的数据执行了update set name='zhangSan’并提交了事务,接着事务A还想查看id=1的记录,结果两次读出来的id=1的记录name值竟然不同,那么这就是不可重复读。
3.幻读
假设事务A访问数据库,查看user表的所有记录,执行了select * from User; 这时候,事务B来了,它往user表中插入了新数据 insert into User values(3,“李四”)并提交;这时候事务A再执行select * from User。 结果发现比刚刚多了一条数据,这情况就叫"幻读"
幻读与不可重复读的区别:
幻读的重点在于插入与删除,即第二次查询会发现比第一次查询得到的数据变少或者变多了。而不可重复读的重点在于修改,即第二次查询与第一次查询的结果不一致,也就是第一次结果已经不可重现了。
为了防止出现以上脏读,不可重复读,幻读等情况,我们就需要根据我们业务的实际需要来设置数据库的隔离级别。
一般的数据库,都包括以下四种隔离级别:

  • 读未提交(Read Uncommitted)
    在这种隔离级别下,查询是不会加锁的,也由于查询的不加锁,所以这种隔离级别的一致性是最差的,可能会产生"脏读",“不可重复读”,“幻读”。
    如无特殊情况,基本不会使用这种隔离级别
  • 读提交(Read Committed)
    读提交,也就是说只能读到已经已经了的内容。
    ,这种隔离级别能够有效的避免脏读。
    但除非在查询中显示的加锁,如:
    select * from User where id = 1 lock in share mode;
    select * from User where id = 1 for update;
    不然,普通查询是不会加锁的
    那为什么"读提交"和"读未提交"一样,都没有查询加锁,但是却能够避免脏读呢?
    这涉及到另一种机制"快照(snapshot)"。
    假设没有"读快照",那么当一个更新的事务没有提交时,另一个对更新数据进行查询的额事务会因为无法查询而阻塞,这种情况下,并发能力就相当的差。
    而"读快照"就可以完成高并发的查询,不过,“读提交"只能避免"脏读”,并不能避免"不可重复读"和"幻读"
    Read Committed也是SQL Server和Oracle的默认级别
  • 可重复读(Repeated Read)
    这种隔离级别是专门用来处理"不可重复读"的情形的,在这个隔离级别下,普通的查询同样是使用的"快照读",但是,和"读提交"不同的是,当事务启动时,就不允许进行"修改操作(update)"了,而从上面可知"不可重复读"就是因为两次读取之间有其他事务对数据进行了修改,因此,“可重复读"能够有效的避免这种情况,但避免不了"幻读”,因为幻读是由于"插入或者删除操作(insert or delete)"而产生的
    Repeated Read是MySql默认级别*
  • 串行化(Serializable)
    这是数据库最高的隔离级别,这种级别下,事务"串行化顺序执行",也就是一个一个的排队执行。
    这种级别下,“脏读”“不可重复读”"幻读"都可以被避免,但是执行效率特别低,性能开销最大,所以基本没人用。

spring中对应的隔离级别

在spring中配置隔离级别在TransactionDefinition接口中定义。

  • ISOLATION_READ_UNCOMMITED(未提交读)
  • ISOLATION_READ_COMMITED(提交读)
  • ISOLATION_REPEATABLE_READ(可重复读)
  • ISOLATION_SERIALIZABLE(序列化)
  • ISOLATION_DEFAULT:用底层数据库的默认隔离级别.
    数据库隔离级别越高,并发执行能力越差,因此在实际项目开发中要综合考虑,为了考虑并发性能一般都是使用"提交读"隔离级别,它能避免丢失更新和脏读,尽管不可重复读和幻读不能避免,但是可以在可能出现的场合使用悲观锁或乐观锁来解决这些问题.

事务传播行为

事务传播行为的定义

spring事务配置相关的类和接口

spring框架支持事务管理的核心是事务管理器,spring提供了很多内置事务管理器,支持不同数据源,常见是以下三种

  • DataSourceTransactionManager:提供对单个javax.sql.DataSource数据源的事务管理,只用于JDBC,MyBatis框架事务管理。
  • HibernateTransactionManager:用于集成Hibernate框架时的事务(只支持Hibernate3+版本)
  • JtaTransactionManager: 提供对分布式事务管理的支持,并将事务管理委托给JavaEE应用服务器,或者自定义一个本地JTA事务管理器,嵌套到应用程序中

实际项目中的事务配置参考

<!--配置数据源dataSource-->
<bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"><property name="url" value="${jdbc_url}" /><property name="username" value="${jdbc_username}" /><property name="password" value="${jdbc_password}" /><!-- 最大并发连接数 --><property name="maxActive" value="${maxActive}" /><!-- 初始化连接数量 --><property name="initialSize" value="${initialSize}" /><!-- 配置获取连接等待超时的时间 --><property name="maxWait" value="${maxWait}" /><!-- 最小空闲连接数 --><property name="minIdle" value="${minIdle}" />  </bean><!-- 配置事务管理器 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" /></bean>```<!-- 使用tx标签配置的拦截器  声明式事务 --><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="delete*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/><tx:method name="insert*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" /><tx:method name="update*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" /><tx:method name="save*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" /></tx:attributes></tx:advice><aop:aspectj-autoproxy proxy-target-class="true"/><aop:config><aop:pointcut id="transactionPointcut" expression="execution(* com.wtl.service..*(..))" /><aop:advisor pointcut-ref="transactionPointcut" advice-ref="txAdvice" /></aop:config>

spring之----事务相关推荐

  1. 【Spring】事务控制API

    Spring事务控制需要明确 1. JavaEE体系进行分层开发,事务处理位于业务层,Spring提供了分层设计==业务层==的事务处理解决方案. 2. Spring框架提供了一组事务控制的接口.在S ...

  2. spring的事务隔离_再深一点:面试工作两不误,源码级理解Spring事务

    原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处. Spring有5种隔离级别,7种传播行为.这是面试常问的内容,也是代码中经常碰到的知识点.这些知识枯燥而且乏味,其中有些非 ...

  3. spring+mybatis事务的readonly属性无效

    在Spring配置事务中设置的read-only="true"不起作用,仍可以执行写操作:但是其他的正常. 查看了一下DataSourceTransactionManager这个类 ...

  4. Spring研究笔记------事务探究

    2019独角兽企业重金招聘Python工程师标准>>> 最近看了比较多Spring的东西,脑中概念知识比较杂乱,借助周六周天的闲暇时间,写一些内容,梳理一下自己脑中的概念,也以此作为 ...

  5. 使用动态代理简单模拟一下spring的事务管理

    按照平时写代码的习惯,我们会定义一个service接口 package com.proxy.test; public interface UserService {public void sayHel ...

  6. spring注解事务

    2019独角兽企业重金招聘Python工程师标准>>> spring注解事务 <!-- 配置事务管理器 --><bean id="transactionM ...

  7. java 自定义异常 未回滚_抛出自定义异常,spring AOP事务不回滚的解决方案

    spring AOP 默认对RuntimeException()异常或是其子类进行事务回滚,也就是说 事务回滚:throw new RuntimeException("xxxxxxxxxxx ...

  8. 哪些方法不能够实施Spring AOP事务

    2019独角兽企业重金招聘Python工程师标准>>> 哪些方法不能够实施Spring AOP事务 由于Spring事务管理是基于接口代理或动态字节码技术.通过AOP实施事务增强. ...

  9. Spring的事务管理1

    事务的回顾: 事务:逻辑上的一组操作,组成这组事务的各个单元,要么全部成功,要么全部失败 事务的特性:ACID 原子性(Atomicity):事务不可分割 一致性(Consistency):事务执行前 ...

  10. Spring的事务管理难点剖析:应用分层的迷惑

    2019独角兽企业重金招聘Python工程师标准>>> Web.Service及DAO三层划分就像西方国家的立法.行政.司法三权分立一样被奉为金 科玉律,甚至有的开发人员认为如果要使 ...

最新文章

  1. el-input怎么绑定回车事件
  2. 少儿编程python课程-选好课程很重要,极客晨星让孩子喜欢上少儿编程
  3. 一次问卷产品的MVP设计
  4. c++primer 12.3.1文本查询程序
  5. linux隔行打印文本,详解正则表达式及Linux三大文本处理工具
  6. 我的docker随笔:开篇
  7. vnpy通过jqdatasdk初始化实时数据及历史数据下载
  8. oracle awr报告生成_oracle11g awr报告分析—WORKLOAD REPOSITORY report
  9. 秀米编辑器使用html,秀米编辑器的操作步骤
  10. Wallpaper透视效果的C++实现(含源文件)
  11. 锐捷、赛尔认证MentoHUST
  12. 五、interfaces 和 daos
  13. 如何在word中的图片上画圈标注_怎么在word图片上画圈
  14. 1.[QT | QCharts | 动态显示]折线图标题字体大小无法更改
  15. Spring Cloud(14)——Function
  16. 分页存储逻辑地址转物理地址
  17. 数字健康-共建共享 火绒安全将亮相2021中华医院信息网络大会(CHINC)
  18. 苹果电脑ntfs如何打开硬盘?苹果电脑读写ntfs
  19. SQL语句优化(雷人代码)
  20. STM32输出PWM信号(库函数版本)

热门文章

  1. 深度学习(10)ablation experiments
  2. 推荐系统论文笔记(1):Hybrid Recommender Systems:Survey and Experiments
  3. 蕴含存在的意义到底是什么
  4. 营销-营销方式:营销方式
  5. MySql两台服务器(主机)间热备份(双机热备份)
  6. 获得PMP证书之后该如何获取续证PDU?
  7. Java编程输入学员小明3门课程成绩,编写程序实现
  8. 腾讯产品18讲10:把握产品需求的管理节奏
  9. DS1302的使用方式 及 51单片机连接DS1302的驱动程序
  10. 华为服务器gpu卡型号,gpu服务器 华为云