事务隔离级别

深入理解oracle的事务隔离性

我与影子孤独终老i 提交于 2020-01-08 17:54:15
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在Oracle关系数据库中,我们先来看下面这个问题: A事务:select <cols> from T where id > 10 and id < 10000; B事务:update T set id = 45000 where id = 4501 两个事务按下面的顺序执行: A事务:|--------------------------------|commit B事务: |-------------|commit 也就是A事务先开始执行,过一段时间B事务再开始执行,但是B事务先执行完并commit提交了,A事务又过了一段时间才完成。那么问题来了,在这种情况下,问A事务能不能取得正确的结果,两个事务之间会不会有干扰,怎么干扰? 这是一个典型的关系型数据库事务的隔离性问题,而且,针对不同的数据库(存储引擎),可能会有不同的表现。 根据上面的描述,以oracle为例,它的缺省数据库隔离级别是读已提交(read-committed),事务A持有一个读锁(瞬间共享读锁),B持有一个排它写锁。 Read Committed读已提交的官方定义是,通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。 按照读已提交的定义,似乎按上题的条件,A

mysql事务隔离的一点理解

你说的曾经没有我的故事 提交于 2020-01-08 17:34:15
前言 先介绍一下事务的概念 事务(Transaction) 就是数据库管理的一个逻辑单位,由一个有效的数据库操作序列构成。 事物ACID特性 原子性(Atomicity):事务作为一个整体被执行,要么全部成功执行,要么全部失败 一致性(Consistency):指的是逻辑上的一致性,即所有操作是符合现实当中的期望的 隔离性(Isolation):多个事务并发时,一个事务不应该影响其他事务的执行 持久性(Durability):被提交过的事务对数据库的修改应该永久保存在数据库中 通俗的理解,就是将一系列的数据库操作(增删改查)看做一个整体,要么所有操作都成功,要么都失败。 一、产生的问题 如果没有事务隔离的话,会发生以下的问题 1. 脏读 脏读 是指一个事务读取了另一个事务未提交的数据 2. 不可重复读 不可重复读 是指事务中多次读取,数据改变。 不可重复读和脏读的区别:不可重复读是事务A读取某行数据后,事务B插入了一行新数据并提交之后,事务A再去读数据,读到了修改后的数据集。 3. 幻读 幻读 是指事务多次读取,结果集数量改变。 上面还有点不清晰,借鉴一下别人的白话解释 幻读,并不是说两次读取获取的结果集不同,幻读侧重的方面是某一次的 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。更为具体一些:select 某记录是否存在,不存在,准备插入此记录,但执行

事务隔离级别

余生长醉 提交于 2020-01-08 16:10:48
1.1 未提交读 未提交读(READ_UNCOMMITTED)是最低的隔离级别,其含义是允许一个事物读取另一个事物没提交的数据。优点在于并发能力高,适合那些对数据一致性没有要求而追求高并发的场景,最大缺点是出现脏读。 @Transactional(isolation = Isolation.READ_UNCOMMITTED) 例子讲解: T3时刻,因为采用未提交读,所以事务2可以读取事务1未提交的库存数据为1,这里当它扣减库存后则数据为0,然后它提交了事务,库存就变为了0 。,而事务1在T5时刻回滚事务,因为第一类丢失更新已经被克服,所以它不会将库存回滚到2,那么最后的结果就变为了0,这样就出现了错误。 1.2 读写提交 读写提交(READ_COMMITTED),一个事务只能读取另外一个事务已提交的数据,不能读取未提交的数据。该级别克服了脏读,但不可重复读。 @Transactional(isolation = Isolation.READ_COMMITTED) 案例讲解: 1.3 可重复读 可重复读(REPEATABLE_READ),目标是克服读写提交中出现的不可重复读的现象,但会出现幻读。 1 @Transactional(isolation = Isolation.REPEATABLE_READ) 案例讲解: 1.4 串行化 串行化(SERIALIZABLE)

数据事务四种隔离机制和七种传播行为

眉间皱痕 提交于 2020-01-08 05:46:46
数据事务四种隔离机制和七种传播行为 一、隔离级别: 数据库事务的隔离级别有4个,由低到高依次为 Read uncommitted、 Read committed、 Repeatable read、 Serializable,这四个级别可以逐个解决 脏读、 不可重复读、 幻读这几类问题。 1. ISOLATION_READ_UNCOMMITTED:这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。 这种隔离级别会产生脏读,不可重复读和幻像读。 2. ISOLATION_READ_COMMITTED:保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据 3. ISOLATION_REPEATABLE_READ:这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。 它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。 4. ISOLATION_SERIALIZABLE:这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。 除了防止脏读,不可重复读外,还避免了幻像读。 我们使用 test 数据库,新建 tx 表:---MySQL数据库 第1级别:Read Uncommitted(读取未提交内容) (1)所有事务都可以看到其他未提交事务的执行结果 (2

数据库事务的四种隔离机制和七种传播行为

不问归期 提交于 2020-01-08 03:59:52
MySQL数据库为我们提供的四种隔离级别:(依次解决脏读、不可重复读、幻读)   ① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。   ② Repeatable read (可重复读):可避免脏读、不可重复读的发生。(Mysql默认的方式)   ③ Read committed (读已提交):可避免脏读的发生。(Oracle默认的方式)   ④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。(INNODB内部机制) 数据库事务正常执行的四个特性: ACID属性: 原子性(atomicity):即不可分割,事务要么全部被执行,要么全部不执行 一致性(consistency):事务的执行使得数据库从一种正确状态转换成另外一种正确状态 隔离性(isolation):在事务正确提交之前,不允许把事务对该数据的改变提供给任何其他事务 持久性(durability):事务正确提交之后,其结果将永远保存在数据库之中,即使在事务提交之后有了其他故障,事务的处理结果也会得到保存 并发下事务产生的问题: 1、脏读:事务A读到了事务B还没有提交的数据; 2、不可重复读:在一个事务里面读取了两次某个数据,读出来的数据不一致; 3、幻读:在一个事务里面的操作中发现了未被操作的数据。 幻读,需要应用使用加锁读来保证

Spring知识点小结

≯℡__Kan透↙ 提交于 2020-01-07 13:52:00
1.Spring是什么? Spring是一个轻量级的IoC和AOP容器框架。目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。常见的配置方式有三种:基于XML的配置、基于注解的配置、基于Java的配置。 主要由以下几个模块组成: Spring Core:核心类库,提供IOC服务; Spring AOP:AOP服务; Spring Context:提供框架式的Bean访问方式; Spring DAO:对JDBC的抽象,简化了数据访问异常的处理; Spring ORM:对现有的ORM框架的支持; Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传; Spring MVC:提供面向Web应用的Model-View-Controller实现。 2、Spring 的优点? spring属于低侵入式设计,代码的污染极低; spring的DI机制将对象之间的依赖关系交由框架处理,减低组件的耦合性; Spring提供了AOP技术,支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理,从而提供更好的复用。 spring对于主流的应用框架提供了集成支持。 3.Spring的AOP理解: AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”

数据库并发事务存在的三个问题(脏读、不可重复读、幻读)

孤街醉人 提交于 2020-01-07 13:20:06
如果不考虑事务隔离性,可能会发生以下情况 脏读: 事务a,读到了事务b未提交的数据,如果事务a读到了事务b的一些中间数据,待处理的数据。b事务数据还没有提交,就被a事务访问了 (解决方法:将 读未提交 级别提高到 读已提交 例如:orale在事务a 更新t表的时候,表t为锁住的状态,事务a未提交之前,事务b就不能访问t表) 不可重复读: 指的是事务两次读取数据不一样。因为中间被其他事务修改了。解决方法就是 将 级别提高到 可重复。使用行级锁,锁定当前记录,其它事务无法更改。针对update操作 幻读: 一个事务在查询,另一个事务在做插入或者删除,此时就会出现幻读。导致表的总行数不一致的情况 事务的干扰级别:读未提交、读已提交、可重复读、串行化。 隔离级别越高,性能越低 参考博客: https://blog.csdn.net/fanzhigang0/article/details/93198059 来源: https://www.cnblogs.com/jkwll/p/12149661.html

Spring事务失效的 8 大原因,这次可以吊打面试官了!

谁说胖子不能爱 提交于 2020-01-07 12:06:27
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 今天再来一篇《 吊打面试官 》系列,这次真的要吊打了,哈哈!(看往期吊打系列请在后台回复: 吊打 ,我会陆续更新……) 前几天栈长不是发了一篇文章,里面有一个关于事务失效的问题: 用 Spring 的 @Transactional 注解控制事务有哪些不生效的场景? 其中有个热心粉丝留言分享了下,我觉得总结得有点经验,给置顶了: 以上留言来源微信公众号:Java技术栈,关注一起学Java! 但是我觉得还是总结得不够全,今天栈长我再总结一下,再延着这位粉丝的总结再补充完善一下,不用说,我肯定也不见得总结全,但希望可以帮忙有需要的人。 1、数据库引擎不支持事务 这里以 MySQL 为例,其 MyISAM 引擎是不支持事务操作的,InnoDB 才是支持事务的引擎,一般要支持事务都会使用 InnoDB。 根据 MySQL 的官方文档: https://dev.mysql.com/doc/refman/5.5/en/storage-engine-setting.html 从 MySQL 5.5.5 开始的默认存储引擎是:InnoDB,之前默认的都是:MyISAM,所以这点要值得注意,底层引擎不支持事务再怎么搞都是白搭。 2、没有被 Spring 管理 如下面例子所示: // @Service public class

mysql 事务隔离级别如何选择

半腔热情 提交于 2020-01-07 01:02:31
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 四个概念: 数据丢失、脏读、不可重复读、幻读 数据丢失,两个事务同时进行,一个成功一个失败,造成数据回滚,或者两个都成功造成数据覆盖 从这个概念,就可以看出事务隔离的必要性,如果没有的话很容易产生这个严重的问题 脏读:在一个事务里面,读取到另一个事务还没提交的数据 不可重复读:一个事务内两次读同一个数据,可能发生变化(一般指该数据事务期间被别的事务修改,理解对一条数据操作) 幻读:一个事务内两次查询数据不一致(条件查询,理解多条数据,其他事务有新增或者删除) 事务隔离分为4个级别 1.read uncommit (读未提交),存在脏读、不可重复度问题、幻读 2.read commit (读已提交),存在不可重复读、幻读 3.repeatable read(可重复读),存在幻读 4.serialable(串行化),没有上面的问题,但性能过低 mysql,默认使用 rr 级别,它通过 mvvc 解决可重复读问题 ,通过 next-key 解决了幻读的问题,next-key 包含 记录锁和 间隙锁 关于 mysql 锁可以参考这篇文章 https://www.linuxidc.com/Linux/2018-11/155501.htm 来源: oschina 链接: https://my.oschina.net

数据库:存储引擎+InnoDB+TokuDB+ MyIASM +Memory+索引+三范式等

余生长醉 提交于 2020-01-06 20:11:10
存储引擎 概念 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以 获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。 存储引擎主要有: 1. MyIsam , 2. InnoDB, 3. Memory, 4. Archive, 5. Federated 。 InnoDB(B+树) InnoDB 底层存储结构为B+树, B树的每个节点对应innodb的一个page,page大小是固定的,一般设为 16k。其中非叶子节点只有键值,叶子节点包含完成数据。 数据库:存储引擎+InnoDB+TokuDB+ MyIASM +Memory+索引+三范式等 适用场景 : 1)经常更新的表,适合处理多重并发的更新请求。 2)支持事务。 3)可以从灾难中恢复(通过 bin-log 日志等)。 4)外键约束。只有他支持外键。 5)支持自动增加列属性 auto_increment。 TokuDB(Fractal Tree-节点带数据) TokuDB 底层存储结构为 Fractal Tree,Fractal Tree 的结构与 B+树有些类似, 在 Fractal Tree中,每一个 child 指针除了需要指向一个 child 节点外