Spring|Spring整合JDBC与事务管理

  • 1 事务
    • 1.1 事务(Transaction)的四个属性(ACID)
    • 1.2 事务并发问题
    • 1.3 事务的隔离级别
  • 2 Spring 中的事务操作
    • 2.1 事务的传播行为

1 事务

事务(Transaction): 事务是并发控制的单元,是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取。事务的正确执行使得数据库从一种状态转换为另一种状态

事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)的缩写。

事务通常是以begin transaction开始,以commit或rollback结束。Commint表示提交,即提交事务的所有操作。具体地说就是将事务中所有对数据的更新写回到磁盘上的物理数据库中去,事务正常结束。Rollback表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库的所有已完成的操作全部撤消滚回到事务开始的状态

事务的作用: 事务管理对于企业级应用而言至关重要,它保证了用户的每一次操作都是可靠的,即便出现了异常的访问情况,也不至于破坏后台数据的完整性。就像银行的自动提款机ATM,通常ATM都可以正常为客户服务,但是也难免遇到操作过程中及其突然出故障的情况,此时,事务就必须确保出故障前对账户的操作不生效,就像用户刚才完全没有使用过ATM机一样,以保证用户和银行的利益都不受损失。

1.1 事务(Transaction)的四个属性(ACID)

  • 原子性(Atomic): 对数据的修改要么全部执行,要么全部不执行。
  • 一致性(Consistent) : 在事务执行前后,数据状态保持一致性。
  • 隔离性(Isolated) : 一个事务的处理不能影响另一个事务的处理。
  • 持续性(Durable) : 事务处理结束,其效果在数据库中持久化。

1.2 事务并发问题

  • 脏读(dirty read): 一个事务读取了另一个事务尚未提交的数据。
  • 不可重复读(non-repeatable read) : 一个事务的操作导致另一个事务前后两次读取到不同的数据 。
  • 幻读(phantom read) : 一个事务的操作导致另一个事务前后两次查询的结果数据量不同。

举例:

事务A、B并发执行时,当A事务update后,B事务select读取到A尚未提交的数据,此时A事务rollback,则B读到的数据是无效的”脏”数据。
当B事务select读取数据后,A事务update操作更改B事务select到的数据,此时B事务再次读去该数据,发现前后两次的数据不一样。
当B事务select读取数据后,A事务insert或delete了一条满足A事务的select条件的记录,此时B事务再次select,发现查询到前次不存在的记录(“幻影”),或者前次的某个记录不见了。

1.3 事务的隔离级别

事务隔离级别,就是为了解决上面几种问题而诞生的。为什么要有事务隔离级别,因为事务隔离级别越高,在并发下会产生的问题就越少,但同时付出的性能消耗也将越大,因此很多时候必须在并发性和性能之间做一个权衡。所以设立了几种事务隔离级别,以便让不同的项目可以根据自己项目的并发情况选择合适的事务隔离级别,对于在事务隔离级别之外会产生的并发问题,在代码中做补偿。

事务隔离级别有4种,但是像Spring会提供给用户5种,来看一下:

  1. DEFAULT
    默认隔离级别,每种数据库支持的事务隔离级别不一样,如果Spring配置事务时将isolation设置为这个值的话,那么将使用底层数据库的默认事务隔离级别。顺便说一句,如果使用的MySQL,可以使用"select @@tx_isolation"来查看默认的事务隔离级别

  2. READ_UNCOMMITTED
    读未提交,即能够读取到没有被提交的数据,所以很明显这个级别的隔离机制无法解决脏读、不可重复读、幻读中的任何一种,因此很少使用

  3. READ_COMMITED
    读已提交,即能够读到那些已经提交的数据,自然能够防止脏读,但是无法限制不可重复读和幻读

  4. REPEATABLE_READ
    可重复读,即在数据读出来之后加锁,类似"select * from XXX for update",明确数据读取出来就是为了更新用的,所以要加一把锁,防止别人修改它。REPEATABLE_READ的意思也类似,读取了一条数据,这个事务不结束,别的事务就不可以改这条记录,这样就解决了脏读、不可重复读的问题,但是幻读的问题还是无法解决

  5. SERLALIZABLE
    串行化,最高的事务隔离级别,不管多少事务,挨个运行完一个事务的所有子事务之后才可以执行另外一个事务里面的所有子事务,这样就解决了脏读、不可重复读和幻读的问题了

事务隔离级别解决的并发问题:

再必须强调一遍,不是事务隔离级别设置得越高越好,事务隔离级别设置得越高,意味着势必要花手段去加锁用以保证事务的正确性,那么效率就要降低,因此实际开发中往往要在效率和并发正确性之间做一个取舍,一般情况下会设置为READ_COMMITED,此时避免了脏读,并发性也还不错,之后再通过一些别的手段去解决不可重复读和幻读的问题就好了。

2 Spring 中的事务操作

不同平台,事务的代码各不相同,Spring 提供了一个接口:PlatformTransactionManager 接口。

spring管理事务的属性介绍:

  • 事务的隔离级别:见1.3
  • 是否只读:true 只读;false 可操作
  • 事务的传播行为

2.1 事务的传播行为

事务传播行为用来描述由某一个事务传播行为修饰的方法被嵌套进另一个方法的时事务如何传播。

事务传播行为类型 说明
PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

参考内容:

  1. Java事务详解
  2. 事务隔离级别

Spring|Spring事务管理相关推荐

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

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

  2. Spring的事务管理1

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

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

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

  4. Spring JDBC-Spring事务管理之数据库事务基础知识

    概述 数据库事务的概念 原子性 一致性 隔离性 持久性 数据并发的问题 脏读dirty read 不可重复读unrepeatable read 幻象读 phantom read 幻象读和不可重复度的区 ...

  5. spring教程--事务管理

    Spring的事务管理 1.1 事务: 事务:是逻辑上一组操作,要么全都成功,要么全都失败. 事务特性: ACID: 原子性:事务不可分割 一致性:事务执行的前后,数据完整性保持一致. 隔离性:一个事 ...

  6. batch spring 重复执行_一个3年老javaer竟然连Spring的事务管理都不知道,惊呆了

    1.事务介绍 事务(Transaction),一般是指要做的或所做的事情.在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit). 这里我们以取钱的例子来讲解:比如你去ATM ...

  7. Spring框架-事务管理注意事项

    转载自 Spring框架-事务管理注意事项 常见事务问题 事务不起作用 可能是配置不起效,如扫描问题 事务自动提交了(批量操作中) 可能是在没事务的情况下,利用了数据库的隐式提交 事务配置说明 通常情 ...

  8. Spring的事务管理难点剖析(4):多线程的困惑

    2019独角兽企业重金招聘Python工程师标准>>> 由于Spring的事务管理器是通过线程相关的ThreadLocal来保存数据访问基础设施(也即Connection实例),再结 ...

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

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

  10. Spring4.x❹ Spring的事务管理 DataSourceTransactionManager

    1 Spring事务管理? 2 Spring 事务管理案例 2.1 实体类 2.2 dao 2.3 service 2.4 Spring配置文件 2.5 test 3 service中的事务管理 3. ...

最新文章

  1. Android studio的深坑 导jar包重复的异常处理
  2. 通过获取客户端Json数据字符串,反序列化为实体对象的一段代码
  3. input发送a.jax_JAX-RS 2.0的新功能– @BeanParam批注
  4. python中面向对象_简述Python中的面向对象编程的概念
  5. Android开源源码推荐(一)
  6. 在CentOS中安装NodeJS
  7. iOS 14.5广告跟踪功能使广告商在安卓支出增长21%
  8. Node.js使用supervisor遭遇‘supervisor’不是内部或外部命令,如果解决?
  9. xml 操作组件(NewLife.XCode)
  10. ue4 classuobject没有成员beginplay_UE4 C++ 智能滚动列表ScrollList
  11. 快速理解Java的三种代理模式
  12. 最详细的 K8S 学习笔记总结
  13. HBuilder X 设置保存时编译
  14. IntelliJ IDEA 破解 到2100年到期
  15. ArcGIS学习总结(六)——地形分析-DEM应用
  16. Pytorch中BatchNorm中running_mean和running_var的计算方法
  17. 四大开源3d游戏引擎探究----irrlicht与orge对比
  18. 华为HCNA路由与交换eNSP实战(2)负载分担和路由备份
  19. 从IMDB上爬取MovieLens数据集中的详细电影信息
  20. 牛客练习赛52 B Galahad (树状数组)

热门文章

  1. IT技术外包公司值得去吗?
  2. Linux中alias设置重命名出现 -bash: alias :XXX :not found 问题的解决
  3. 【数据结构】广义表的基本概念
  4. PS制作钢铁质感文字
  5. Python 文件查找
  6. 7-第一个汇编程序hello world
  7. 程序员转行能做什么?
  8. jQuery事件总结(二)
  9. 【20210906】让实验室服务器运行本地python代码
  10. 2022年个人融资方法和工具研究报告