事务隔离级别

MySQL事务隔离级别

二次信任 提交于 2019-12-04 07:08:50
  事务有 ACID 四个基本属性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)   数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。—— 维基百科 事务的概念看上去不难,但是需要注意以下几个点: 1、首先,事务就是要保证一组数据库操作,要么全部成功,要么全部失败; 2、在 MySQL 中,事务支持是在 引擎层 实现的; 3、并不是所有引擎都支持事务,如 MyISAM 就不支持,InnoDB 就支持; 今天,我们的主角是 隔离性 ,隔离性是指当多个用户并发操作数据库时,数据库为每一个用户开启不同的事务,这些事务之间相互不干扰,相互隔离。 脏读   脏读(dirty read),简单来说,就是一个事务在处理过程中读取了另外一个事务未提交的数据。这种未提交的数据我们称之为脏数据。依据脏数据所做的操作肯能是不正确的。 不可重复读   不可重复读(non-repeatable read), 是指一个事务范围内,多次查询某个数据,却得到不同的结果 。 在第一个事务中的两次读取数据之间,由于第二个事务的修改, 第一个事务两次读到的数据可能就是不一样的。   脏读和不可重复读的区别: 脏读 是某一事务 读取了 另外一个事务 未提交 的数据, 不可重复读

数据库

痴心易碎 提交于 2019-12-04 06:35:28
并发事务带来哪些问题? 在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对同一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题。 脏读(Dirty read): 当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。 丢失修改(Lost to modify): 指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。 例如:事务1读取某表中的数据A=20,事务2也读取A=20,事务1修改A=A-1,事务2也修改A=A-1,最终结果A=19,事务1的修改被丢失。 不可重复读(Unrepeatableread): 指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。 幻读(Phantom read): 幻读与不可重复读类似。它发生在一个事务

mysql事务

允我心安 提交于 2019-12-04 06:29:54
mysql事务是数据库系统区别于其他文件系统的重要特性之一,事务是一组具有原子性sql的语句,或是一个独立工作的单元。 事务具有以下几点特性: 原子性,隔离性,可持久性,一致性 事务隔离性的四个级别 1、未提交读 2、已提交读,一个事务中可以读到其他事务已经提交的数据。 3、可重复读,就是一个事务中读到的数据不变。(innodb的默认设置) 4、串行化,就是事务一个个的执行 隔离级别又低到高,并发性由高到低 大事务 运行时间长,操作数据比较多的事务。大事务会锁定太多数据,造成大量超时和阻塞。对于大事务要分批操作数据,并且将不必要的查询操作移除事务。 mysql引擎,myisam,innodb myisam 不支持事务,表级锁 innodb事务级搜索引擎,完美支持行级锁,支持事务的acid特性。 来源: https://www.cnblogs.com/xiaofeiyang/p/11837637.html

Mysql --09 Innodb核心特性——事务

旧城冷巷雨未停 提交于 2019-12-04 04:56:16
目录 Innodb核心特性——事务 1.什么是事务 2.事务的通俗理解 3.事务ACID特性 4.事务流程举例 5.事务的控制语句 6.事务隐式提交情况 7.事务日志redo基本功能 8.redo数据实例恢复过程 9.事务日志undo 10.redo和undo的存储位置 11.事务中的锁 12.多版本并发控制(MVCC) 13.锁的粒度 14.事务的隔离级别 15.脏读 幻读 重复读 查询原因,和解决办法 (RR级别) Innodb核心特性——事务 1.什么是事务 主要针对DML语句(update,delete,insert) 一组数据操作执行步骤,这些步骤被视为一个工作单元: 1)用于对多个语句进行分组 2)可以在多个客户机并发访问同一个表中的数据时使用 所有步骤都成功或都失败 1)如果所有步骤正常,则执行 2)如果步骤出现错误或不完整,则取消 2.事务的通俗理解 伴随着“交易”出现的数据库概念。 我们理解的“交易”是什么? 1)物与物的交换(古代) 2)货币现金与实物的交换(现代1) 3)虚拟货币与实物的交换(现代2) 4)虚拟货币与虚拟实物交换(现代3) 数据库中的“交易”是什么? 1)事务又是如何保证“交易”的“和谐”? 2)ACID 3.事务ACID特性 Atomic(原子性) 所有语句作为一个单元,要么全部成功执行或全部取消。 Consistent(一致性)

Mysql事务隔离级别

只谈情不闲聊 提交于 2019-12-04 04:18:22
一、事务的四大特性(简称ACID) 数据库如果支持事务的操作,那么就具备以下四个特性: 1、原子性(Atomicity) 事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。 2、一致性(Consistency) 事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。 3、隔离性(Isolation) 一个事务的执行不能被其他事务干扰。 4、持续性/永久性(Durability) 一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。 二、事务的四种隔离级别 按照SQL:1992 事务隔离级别,InnoDB默认是可重复读的(REPEATABLE READ)。MySQL/InnoDB 提供SQL标准所描述的所有四个事务隔离级别。你可以在命令行用--transaction-isolation选项,或在选项文件里,为所有连接设置默认隔离级别。 例如,你可以在my.inf文件的[mysqld]节里类似如下设置该选项: transaction-isolation = {READ-UNCOMMITTED | READ-COMMITTED | REPEATABLE-READ | SERIALIZABLE} 用户可以用SET TRANSACTION语句改变单个会话或者所有新进连接的隔离级别。它的语法如下: SET [SESSION |

mysql三-1:存储引擎

为君一笑 提交于 2019-12-04 03:32:45
阅读目录 一 什么是存储引擎 二 mysql支持的存储引擎 三 使用存储引擎 一 什么是存储引擎 mysql中建立的库===>文件夹 库中建立的表===>文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处理文本用txt类型,处理表格用excel,处理图片用png等 数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎。 存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方 法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和 操作此表的类型) 在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql 数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据 自己的需要编写自己的存储引擎 SQL 解析器、SQL 优化器、缓冲池、存储引擎等组件在每个数据库中都存在,但不是每 个数据库都有这么多存储引擎。MySQL 的插件式存储引擎可以让存储引擎层的开发人员设 计他们希望的存储层,例如,有的应用需要满足事务的要求,有的应用则不需要对事务有这 么强的要求 ;有的希望数据能持久存储,有的只希望放在内存中,临时并快速地提供对数据 的查询。 二

Hibernate的事务

江枫思渺然 提交于 2019-12-04 03:30:12
1、数据库的封锁( https://www.cnblogs.com/zhai1997/p/11710082.html ): 封锁是实现并发控制的重要技术。 read uncommitted : 读取尚未提交的数据 read committed:读取已经提交的数据 ,可以解决脏读 ,oracle默认的级别。 repeatable read:重读读取,可以解决脏读 和 不可重复读 ,mysql默认的级别。 serializable:串行化,可以解决脏读不可重复读和丢失修改,相当于锁表,会使得数据库的效率极低。 2、Hibernate操作数据库时的隔离级别: 1:读未提交 2:读已提交 4:可重复读 8:串行化 隔离级别的设置: <property name="hibernate.connection.isolation">4</property> 3、事务处理: 在事务处理的过程中,最关键的问题是要保证dao层和service层操作的是同一个session对象,在Hibernate中,我们只需要调用相应的方法。 注意事项: (1)不需要手动关闭事务,因为调用该方法时,提交事务后会自动关闭。 (2)在调用方法之前必须先配置: <!--指定session与当前线程绑定--> <property name="hibernate.current_session_context_class"

数据库存数据时,逻辑上防重了为啥还会出现重复记录?

丶灬走出姿态 提交于 2019-12-04 01:37:50
在很多异常情况下,比如高并发、网络糟糕的时候,数据库里偶尔会出现重复的记录。 假如现在有一张书籍表,结构类似这样 +----+--------------+ | id | name | +----+--------------+ | 1 | 世界简史 | +----+--------------+ 在异常情况下,可能会出现下面这样的记录 +----+--------------+ | id | name | +----+--------------+ | 1 | 世界简史 | | 2 | 人类简史 | | 3 | 人类简史 | +----+--------------+ 但是,想了想,自己在处理相关数据的时候也加了判重的相关逻辑,比如,新增时当图书 name 相同时,会提示图书重复而返回。 初次遇到这个情况的时候,感觉有点摸不着头脑,后面想了想,还是理清了,其实这和数据库的事务隔离级别有一定关系。 先简单说下数据库事务的 4 个隔离级别,然后重现下上述问题,最后说说解决办法。 1 数据库事务的 4 个隔离级别 1.1 未提交读 顾名思义,当事务隔离级别处于这个设置的时候,不同事务能读取其它事务中未提交的数据。 便于说明,我开了两个客户端(A 以及 B),并设置各自的隔离级别为未提交读。(并没有全局设置) 设置隔离级别命令 SET [SESSION | GLOBAL]

Mysql常见的引擎

家住魔仙堡 提交于 2019-12-03 22:44:47
Mysql常见的引擎 常用的引擎是:Innodb和Myiasm这两种引擎: innodb: 提供了对事务的ACID操作,还提供了行级锁和外键约束,,他的优势就是处理大量数据,在msql启动的时候,首先会建立一个缓存池,主要是缓存数据和索引,但是操作大规模的数据查找时很慢,所以建议当需要数据库的事务操作时,使用这个,还有就是在写的时候不会锁定全表,所以在大规模并发操作的时候会提高效率; Myiasm: 这个是默认的引擎,不提供事务和行级锁和外键约束,当在insert和update时会锁定全表,所以在执行写操作对的时候效率会很慢, 和innodb不同的是,myiasm保留了行数,所以在执行select count(*) from 的时候会很快,不需要扫描全表,当我们执行的读操作多于写操作的时候,并且不需要事务的支持,我们可以使用myisam这个引擎。 这两种引擎的数据结构都是B+树 存储的不同: mysisam树节点存储得是数据的地址,指向实际的数据; innodb树节点存储得是实际的数据;这种索引也被称为聚集索引 常见的引擎 InnoDB MyISAM Memory/Heap BDB Merge Example CSV MaxDB Archive MyISAM:Mysql 5.0之前的默认数据库引擎,最为常用。拥有较高的插入,查询速度,但不支持事务 InnoDB:事务型速记的首选引擎

事务隔离级及脏读、幻读和不可重复读

拜拜、爱过 提交于 2019-12-03 21:12:43
隔离级别 数据库事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事务的并发操作中可能会出现脏读,不可重复读,幻读。 Read uncommitted(读未提交):就是一个事务可以读取另一个未提交事务的数据。如下,A、B两个事务在在并发的情况下访问同一数据时,B事务读取的数据为A事务修改后但未提交的事务,这种情况下可能导致一系列问题。 A事务 B事务 1 A事务开启 2 B事务开启 3 A事务读取数据为1000,并且使用了update,把数据改为2000 4 B事务读取数据为2000 5 A事务提交 Read committed(读提交):就是一个事务要等另一个事务提交后才能读取数据。这种事务各类级别依旧会出现问题,很多人会有疑问,B事务读取的内容不是恰好为A提交后的事务吗,A和B事务都没有错,这样能有什么问题!?不要着急慢慢看,咱们先把4种隔离级别分析完。 A事务 B事务 1 A事务开启 2 B事务开启 3 A事务读取数据为1000,并且使用了update,把数据改为2000 4 A事务提交 5 B事务读取的数据为2000 Repeatable read(重复读):就是在开始读取数据(事务开启)时,不再允许修改操作,不过这样表述不太严谨