隔离级别

Spring事务的基本原理、传播属性、隔离级别

喜夏-厌秋 提交于 2020-01-19 17:45:28
一、事务的基本要素(ACID) 事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功。其必须遵循四个原则(ACID)。 原子性(Atomicity):指一个事务要么全部执行,要么不执行,也就是说一个事务不可能只执行了一半就停止了.比如你从取款机取钱,这个事务可以分成两个步骤:1划卡,2出钱.不可能划了卡,而钱却没出来.这两步必须同时完成.要么就不完成。 一致性(Consistency):在事务执行前数据库的数据处于正确的状态,而事务执行完成后数据库的数据还是应该处于正确的状态,即数据完整性约束没有被破坏;如银行转帐,A转帐给B,必须保证A的钱一定转给B,一定不会出现A的钱转了但B没收到,否则数据库的数据就处于不一致(不正确)的状态。 隔离性(Isolation):并发事务执行之间互不影响,在一个事务内部的操作对其他事务是不产生影响,这需要事务隔离级别来指定隔离性; 持久性(Durability):事务一旦执行成功,它对数据库的数据的改变必须是永久的,不会因比如遇到系统故障或断电造成数据不一致或丢失。 二、数据库隔离级别 隔离级别 隔离级别的值 脏读 不可重复读 幻读 读未提交 Read-Uncommitted 0 是 是 是 不可重复读 (read-committed) 1 否 是 否 可重复读 (repeatable-read) 2 否 否

MySQL事务的实现原理

[亡魂溺海] 提交于 2020-01-17 21:38:58
特点 原子性(Atomicity),一致性(Consistency),隔离型(Isolation)以及持久性(Durability) 一、事务的目的 1、可靠性和并发处理 可靠性:数据库要保证当insert或update操作时抛异常或者数据库crash的时候需要保障数据的操作前后的一致,想要做到这个,我需要知道我修改之前和修改之后的状态,所以就有了undo log和redo log。 并发处理:也就是说当多个并发请求过来,并且其中有一个请求是对数据修改操作的时候会有影响,为了避免读到脏数据,所以需要对事务之间的读写进行隔离,至于隔离到啥程度得看业务系统的场景了,实现这个就得用MySQL 的隔离级别。 二、实现事务功能的三个技术 1、日志文件(redo log 和 undo log) 2、锁技术 3、MVCC 1.1 redo log 与 undo log介绍 1.1.1redo log 什么是redo log ? redo log叫做重做日志,是用来实现事务的持久性。该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log),前者是在内存中,后者在磁盘中。 当事务提交之后会把所有修改信息都会存到该日志中。假设有个表叫做tb1(id,username) 现在要插入数据(3,ceshi) start transaction; select

sqlserver事务隔离小结

我是研究僧i 提交于 2020-01-16 08:37:25
SQL Server通过在锁资源上使用不同类型的锁来隔离事务。为了开发安全的事务,定义事务内容以及应在何种情况下回滚至关重要,定义如何以及在多长时间内在事务中保持锁定也同等重要。这由隔离级别决定。应用不同的隔离级别,SQL Server赋予开发者一种能力,让他们为每一个单独事务定义与其他事务的隔离程度。事务隔离级别的定义如下: · 是否在读数据的时候使用锁 · 读锁持续多长时间 · 在读数据的时候使用何种类型的锁 · 读操作希望读已经被其他事务排他锁住的数据时,怎么办?在这种情况下, SQL Server 可以: · 一直等到其他事务释放锁 · 读没有提交的数据 · 读数据最后提交后的版本 ANSI 99定义了4种事务隔离级别,SQL Server 2005能够完全支持这些级别: · 未提交读 在读数据时不会检查或使用任何锁。因此,在这种隔离级别中可能读取到没有提交的数据。 · 已提交读 只读取提交的数据并等待其他事务释放排他锁。读数据的共享锁在读操作完成后立即释放。已提交读是 SQL Server 的 默认 隔离级别。 · 可重复读 像已提交读级别那样读数据,但会保持共享锁直到事务结束。 · 可序列化 工作方式类似于可重复读。但它不仅会锁定受影响的数据,还会锁定这个范围。这就阻止了新数据插入查询所涉及的范围,这种情况可以导致幻像读。 此外,SQL

数据库锁

风流意气都作罢 提交于 2020-01-13 22:01:56
1 前言 数据库大并发操作要考虑死锁和锁的性能问题。看到网上大多语焉不详(尤其更新锁),所以这里做个简明解释,为下面描述方便,这里用T1代表一个数据库执行请求,T2代表另一个请求,也可以理解为T1为一个线程,T2 为另一个线程。T3,T4以此类推。下面以SQL Server(2005)为例。 2 锁的种类 共享锁(Shared lock)。 例1: ---------------------------------------- T1: select * from table (请想象它需要执行1个小时之久,后面的sql语句请都这么想象) T2: update table set column1='hello' 过程: T1运行 (加共享锁) T2运行 If T1 还没执行完 T2等...... else 锁被释放 T2执行 endif T2之所以要等,是因为T2在执行update前,试图对table表加一个排他锁, 而数据库规定同一资源上不能同时共存共享锁和排他锁。所以T2必须等T1 执行完,释放了共享锁,才能加上排他锁,然后才能开始执行update语句。 例2: ---------------------------------------- T1: select * from table T2: select * from table 这里T2不用等待T1执行完

你可能知道事务的四大特性,但是你不一定知道事务的实现原理

天涯浪子 提交于 2020-01-13 20:08:58
说到数据库,那就一定会聊到事务,事务也是面试中常问的问题,我们先来一个面试场景: 面试官:"事务的四大特性是什么?" 我:"ACID,即原子性(Atomicity)、隔离性(Isolation)、持久性(Durability)、一致性(Consistency)!" 面试官:"在 MySQL 数据库的 InnoDB 引擎是怎么实现这四大特性的?" 我:"这个...这个....,还真没有了解过哎" 面试官:"那我们就先这个吧,先回去吧,我们会通知你的~" 这可能是比较常见的面试场景了,你也许回答到了事务的四大特性,但是不一定知道他的实现原理。今天我们就来一起打卡事务的四大特性和实现原理,对于原理的实现,这篇文章只是粗略的介绍一下,更多的细节可以关注我后续的文章。 数据库的事务有四大特性: 原子性、隔离性、永久性、一致性 ,下面将介绍这四大特性的定义和在 InnoDB 引擎中是怎么实现的。 原子性 定义 一次操作是不可分割的,要么全部成功,要么全部失败。比如我们的转账操作,不允许出款方成功,收款方失败这种情况,要么都成功,要么多失败,不可能出现中间状态。 实现 InnoDB 引擎使用 undo log(归滚日志)来保证原子性操作 ,你对数据库的每一条数据的改动(INSERT、DELETE、UPDATE)都会被记录到 undo log 中,比如以下这些操作: 你插入一条记录时

MySQL事务和事务隔离级别

走远了吗. 提交于 2020-01-09 02:41:20
1、概述 事务就是对数据库数据进行更改(包括insert、update、delete等)操作的一个执行单元,通常有一条或多条更改语句组成。在同一个事务中的更改操作要么同时成功,要么同时失败。 事务具有4个属性:原子性、一致性、隔离性、持久性。即 ACID 特性。 原子性(atomicity):同一个事务中的更改操作要么同时成功,要么同时失败。 一致性(consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。 隔离性(isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的。 持久性(durability):指一个事务一旦提交,对数据库中数据的改变就应该是永久性的。 下面我们详细介绍一下隔离性。 2、四个隔离级别 MySQL 中有四个隔离级别: READ UNCOMMITTED 读未提交,一个事务内部可以读到其他事务未提交的更改,可能出现“脏读” READ COMMITTED 读已提交,一个事务内部可以读到其他事务已提交的更改,这个比较常用 REPEATABLE READ 可重复读,InnoDB引擎默认使用的隔离级别。一个事务内部不能读到其他事务做的任何更改,可能出现“幻读” SERIALIZABLE 串行化,不支持并发 3、修改事务隔离级别 MySQL 的 InnoDB 引擎默认使用的是

事务隔离级别

余生长醉 提交于 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

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

一文讲透数据库事务四原则

ⅰ亾dé卋堺 提交于 2020-01-06 15:43:03
本文始发于个人公众号: TechFlow 说到数据库,以前我老师有一句很经典的话。你可以不会写SQL,但是一定不能不知道 ACID 。 在工业领域,SQL可以说是应用最广泛的技术。从后端到算法,从数据到DBA,再到产品,甚至连一些运营也会基本的SQL。所以如果你现在还不太会的话,我建议你用一个下午的时间找个网站好好学一下。 原本我是想直接写些Hbase相关的内容,但是我发现要想讲清楚Hbase,必须要讲noSQL数据库。如果将noSQL,则又离不开最传统的关系型数据库。所以我们一步一步来,先从基础的关系型数据库讲起。或许我这么说并不准确,因为数据库并不基础,相反它十分复杂。从索引到各种优化和设计原理,再到内部的各种算法和数据结构,涉及到的内容非常多。我们先把浩如烟海的知识放一放,先从最核心的数据库四大原则开始说起。 数据库事务ACID四大原则, A代表Atomicity,即原子性。C表示Consistency,即一致性。I表示Isolation,即隔离性。D表示Durability,即持久性 。 这四个原则了解过数据库的应该都如雷贯耳。可是真正面试的时候被问起来,能一个不落说得上来,并且讲得清楚原委的就不多了。我觉得主要是因为我们的翻译过于文雅,不像英文那么直观,所以很难顾名思义。另一个原因是我们在学习的时候理解不够深入,只知道原因,不知道原因的究竟。所谓知其然,不知其所以然。