隔离级别

数据库事务特性以及隔离级别

旧巷老猫 提交于 2019-12-01 20:27:35
1,事务特性: 数据库的事务特性有四个,分别是原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持久性(Durability),也就是传说中的ACID。他们大概的意思就是: (1)原子性:一个事物会包括很多操作,比如增删改,原子性就是要保证这些操作,要么全部成功,如果有一个失败,那么全部失败。 (2)一致性:事务执行前和事务执行后应保持库一致,感觉像没说一样,一个例子,一个事物的操作为将A表的数据存到B表中,那么当事务执行完毕之后,必须保证A+B跟事务执行前的A+B值是一样的 (3)隔离性:事务和事务之间的特性,两个事务相互隔离,互相不影响 (4)持久性:事务执行完毕之后,表中的数据就持久下来,不会自己没事就消失了 2,事务的隔离级别 事务的隔离级别,指的就是事务的四个特性中的隔离性的级别,按照隔离的强度区别,分为四个级别 (1)读未提交: 指的是一个事务可以读出另一个事务未提交的结果,举个例子:发工资了,经理准备给小王发50000块钱,执行了一个sql,将50000块钱存到了小王的表里,小王这时候看到了很开心,觉得瞬间从屌丝变成了高富帅,这时候经理发现不对,多打了一个0!!于是就执行了一个sql,修改了50000变成了5000,然后提交了事务,这时候小王取钱,只能取到5000了。 (2)读已提交 指的是事务只能读到别的事务提交后的结果

事务的隔离级别

馋奶兔 提交于 2019-12-01 20:10:18
事务的隔离级别 READ UNCIMMITTED(未提交读)   事务中的修改,即使没有提交,其他事务也可以看得到,这种现象就叫做脏读,   例如: ​ A账户2000元,B账户0元,C账户0元 ​ A给B转账 2000元 ​ 1、开启事务 ​ 2、查看 A 有没有 2000 元 ​ 3、有——A 减 2000元;无——回滚 ​ 4、B 加 2000元(停在这一步了) ​ 5、提交事务 ​ 这是一个正常的事务 ​ 假如这个事务还没有提交,但是已经走到第三步了,这个时候又来了一个事务:B 给 C 转账 2000 元 ​ B给C转账 2000元 ​ 1、开启事务 ​ 2、查看 B 有没有 2000 元 (可以查询到其他事务未提交的数据) ​ 3、有——B 减 2000元;无——回滚 ​ 4、B 加 2000元 ​ 5、提交事务   总结:这就是事务还没提交,而别的事务可以看到他其中修改的数据的后果,也就是脏读。    READ COMMITTED(读已提交)   大多数数据库系统的默认隔离级别是READ COMMITTED(读已提交),这种隔离级别就是一个事务的开始,只能看到已经完成的事务的结果,正在执行的,是无法被其他事务看到的。这种级别会出现读取 旧数据 的现象   重复读就是在事务内重复读取了别的线程已经提交的数据,但两次读取的结果不一致,原因是查询的过程中其他事物做了更新的操作

深入学习MySQL事务:ACID特性的实现原理

邮差的信 提交于 2019-12-01 19:01:21
事务是MySQL等关系型数据库区别于NoSQL的重要方面,是保证数据一致性的重要手段。 本文将首先介绍 MySQL 事务相关的基础概念,然后介绍事务的ACID 特性,并分析其实现原理。 MySQL博大精深,文章疏漏之处在所难免,欢迎批评指正。 一、基础概念 事务(Transaction)是访问和更新数据库的程序执行单元;事务中可能包含一个或多个sql语句,这些语句要么都执行,要么都不执行。作为一个关系型数据库,MySQL支持事务,本文介绍基于MySQL5.6。 首先回顾一下MySQL事务的基础知识。 (1). 逻辑架构和存储引擎 图片来源:https://blog.csdn.net/fuzhongmin05/article/details/70904190 如上图所示,MySQL服务器逻辑架构从上往下可以分为三层: (1)第一层:处理客户端连接、授权认证等。 (2)第二层:服务器层,负责查询语句的解析、优化、缓存以及内置函数的实现、存储过程等。 (3)第三层:存储引擎,负责MySQL中数据的存储和提取。 MySQL 中服务器层不管理事务,事务是由存储引擎实现的。 MySQL支持事务的存储引擎有InnoDB、NDB Cluster等,其中InnoDB的使用最为广泛;其他存储引擎不支持事务,如MyIsam、Memory等。 如无特殊说明,后文中描述的内容都是基于InnoDB。 (2).

事物的四种隔离级别 脏读、不可重复读 、幻读, 序列化的 简单介绍。

天涯浪子 提交于 2019-12-01 16:22:50
一、原理解析    来自对 https://www.cnblogs.com/ubuntu1/p/8999403.html 的编写。 一、事物的四种隔离级别? /* 由低到高分为 Read uncommitted 读未提交 脏读! Read committed 读提交 不可重复读。 Repeatable read 重复读 幻读 Serializable 序列化 串行读 */ 1. Read uncommitted (脏读!) // 读未提交 就是一个事物可以读取另一个未提交事物的数据。 事例:老板要给程序员发工资,程序员的工资是3.6万/月。但是发工资时老板不小心按错了数字,按成3.9万/月, 【该钱已经打到程序员的户口,但是事务还没有提交】, 就在这时,程序员去查看自己这个月的工资,发现比往常多了3千元。 【但是老板及时发现了不对,马上回滚差点就提交了的事务,将数字改成 3.6 万再提交。】 // 分析:实际程序员这个月的工资还是3.6万,但是程序员看到的是3.9万。他看到的是老板还没提交事务时的数据。这就是脏读。 2. Read committed (不可重复读) // 读提交 就是一个事物要等待领一个事物提交后才能读取数据。 事例:程序员拿着信用卡去享受生活(卡里当然是只有 3.6 万),当他埋单时(程序员事务开启), 收费系统事先检测到他的卡里有 3.6 万, 就在这个时候!

MySQL数据库事务隔离级别(Transaction Isolation Level)

风格不统一 提交于 2019-12-01 09:33:31
数据库隔离级别有四种,应用《高性能mysql》一书中的说明: 然后说说修改事务隔离级别的方法: 1.全局修改,修改mysql.ini配置文件,在最后加上 1 #可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE- READ, SERIALIZABLE. 2 [mysqld] 3 transaction-isolation = REPEATABLE-READ 这里全局默认是REPEATABLE-READ,其实MySQL本来默认也是这个级别 2.对当前session修改,在登录mysql客户端后,执行命令: 要记住mysql有一个autocommit参数,默认是on,他的作用是每一条单独的查询都是一个事务,并且自动开始,自动提交(执行完以后就自动结束了,如果你要适用select for update,而不手动调用 start transaction,这个for update的行锁机制等于没用,因为行锁在自动提交后就释放了),所以事务隔离级别和锁机制即使你不显式调用start transaction,这种机制在单独的一条查询语句中也是适用的,分析锁的运作的时候一定要注意这一点 再来说说锁机制: 共享锁 :由读表操作加上的锁,加锁后其他用户只能获取该表或行的共享锁,不能获取排它锁,也就是说只能读不能写 排它锁 :由写表操作加上的锁

数据库隔离级别解决的问题

ぃ、小莉子 提交于 2019-12-01 08:03:22
脏读:读取了别人未提交的数据。 不可重复读: 同一个事务对数据的多次读取的结果不一致 。 幻读:是 指在同一个事务中,前后两个相同的查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行 。 但不可重复读重点在于update和delete,而幻读的重点在于insert。 来源: https://www.cnblogs.com/u013533289/p/11671792.html

mysql事务的隔离级别

耗尽温柔 提交于 2019-12-01 07:45:57
事务隔离级别(transaction isolation levels):隔离级别就是对事务并发控制的四个等级。分为 1 串行化(SERIALIZABLE) 2 可重复读(REPEATABLE READ) 3 读已提交(READ COMMITED) 4 读未提交(READ UNCOMMITED): 设置隔离级别,set TRANSACTION ISOLATION LEVEL READ UNCOMMITED; Read uncommitted:当前事务能读到其他事务未提交的数据,这种情况叫脏读。 SET TRANSATION ISOLATION LEVEL READ COMMITED; READ COMMITTED:在当前事务过程中,不可能产生脏读。可能读到不同的数据(比如两个事务,一个事务刚刚更新一条数据,另一个事务查询的结果还是旧数据,但是一旦提交,同样的查询语句,却显示出来不同的结果),这种情况叫不可重复读。 SET TRANSATION ISOLATION LEVEL SERIALIZABLE; SERIALIZABLE:这种隔离界别表示,在当前事务执行过程中,其他事务只能等待,事务不能并发执行 SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; REPEATABLE READ:可重复读。 可重复读业务情景:

mysql事务隔离级别

谁都会走 提交于 2019-12-01 07:20:50
事务的四大特性 1.原子性 2.一致性 3.隔离性 4.持久性 四种事务隔离级别 1.未提交读 2.已提交读 3.可重复读 4.可串行化 事务隔离要解决三个问题 1.脏读,读取到了未提交事务的数据,比如未提交读就会产生这种数据 2.不可重复读,在同一个事务里两次读取的数据不一样,因为在两次读取的过程中,另一个事务提交改变了该值。未提交读,已提交读又称为不可重复读,会产生这种情况。 3.幻读,与不可重复读类似,幻读是两次查询的行个数不一样。幻读针对的是多行,不可重复读针对的是一行或者一个数据。事务隔离级别前三种都可能会产生这种情况。 可串行化三种情况都不会产生,但是效率比较低,他是一个事务执行完毕,才能执行下一个事务。 来源: https://www.cnblogs.com/scru/p/11668072.html

MySQL事务和隔离级别

那年仲夏 提交于 2019-12-01 07:19:36
Mysql事务 避免事务,会占用内存 事务是啥? 简而言之:事务 - 就是保护多条执行的sql语句,要么全部成功,要么全部失败 比如:转账就是一个事务:从一个用户将资金转出,再将资金转入到另一个用户,这两个操作看做一体 事务是在哪个层实现的? 事务是引擎层实现的,mysql是多引擎的系统,不是所有引擎都支持事务的,比如MySQL原生的MyISAM就不支持事务,这也是MyIASM被InnoDB取代的原因之一。 事务ACID特性 原子性: 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 一致性: 在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。 隔离性: 数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。 持久性: 事务处理结束后

事务及事务的隔离级别

萝らか妹 提交于 2019-11-30 19:17:08
事务及事务的隔离级别 1.什么是事务 2.事务的四个特性 3.并发事务导致的问题 4.事务的四种隔离级别 1.什么是事务 事务是由一系列对系统中数据进行访问与更新的操作组成的程序执行逻辑单元。事务是DBMS中最基础的单位,事务不可分割。(事务是一个或多个连接在一起作为一个逻辑单元运行的SQL语句。DBMS认为事务是不可分割的,要么全部执行,要么全不执行。) 2.事务的四个特性 1.原子性:要么事务中所有的数据修改都执行,要么都撤销。(操作这些指令时,要么全部执行成功,要么全部不执行。只要其中一个指令执行失败,所有的指令都执行失败,数据进行回滚,回到执行指令前的数据状态。) 2.一致性:完全的事务应让数据保持一致来保证数据完整。一致状态要保证满足所有数据约束。(事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定。) 3.隔离性:事务的影响独立(或隐藏)于其他事务。(隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。 即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。) 4.持久性:在事务完成后,它的影响是永久的和持续的,即便是系统崩溃。