事务隔离级别

MySql的“MVCC”之我的理解

廉价感情. 提交于 2019-12-16 00:09:32
数据库隔离级别通俗解释: 读未提交:一个事务还没提交时,它做的变更就能被别的事务看到 读提交:一个事务提交以后,它做的变更才会被其他事务看到 可重复读:一个事务执行过程中看到的数据,总是跟这个事务在启动时候看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的 串行化:对于同一个记录,“写”会加“写锁”,读会加读锁。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才可以继续执行。 MYSQL的MVCC: MVCC(Mutil-Version Concurrency Control),就是多版本并发控制。MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问。 在Mysql的InnoDB引擎中就是指在已提交读(READ COMMITTD)和可重复读(REPEATABLE READ)这两种隔离级别下的事务对于SELECT操作会访问版本链中的记录的过程。 这就使得别的事务可以修改这条记录,反正每次修改都会在版本链中记录。SELECT可以去版本链中拿记录,这就实现了读-写,写-读的并发执行,提升了系统的性能。 我们来具体看看是如何实现的。 版本链 我们先来理解一下版本链的概念。在InnoDB引擎表中,它的聚簇索引记录中有两个必要的隐藏列: trx_id这个id用来存储的每次对某条聚簇索引记录进行修改的时候的事务id。 roll

深入理解mysql事务

元气小坏坏 提交于 2019-12-16 00:03:37
做为开发人员对数据库事务应该都不陌生,但是如果知其然而不知其所以然的话,在开发中难免写出来的代码存在bug,本文主要介绍mysql中的事务,重点讲解事务的隔离级别。 1. ACID 1.1 原子性 原子性是指事务是一个不可分割的工作单位,事务中的操作要么全部执行,要么全部都不执行。 例如: begin // 开启事务 A:update user set account=account+1 where id =1; B:update user set account=account+1 where id =1; commit 这个事务,执行commit时,在么两条语句都执行成功,如果出错,执行rollback时,两条语句的操作都会回滚到原始状态; undo log保证原子性 在操作任何数据之前,首先将数据备份到一个地方(这个存储数据的地方就是undo log)。然后进行数据的修改,如果用户出现了错误或者用户执行了rollback语句,系统可用利用undo log中的备份的数据恢复到事务开始之前的状态。 注意:undo log是逻辑日志 可以理解为: 当delete一条记录时,undo log中记录一条对应的insert记录 当insert 一条记录时,undo log中会记录一条对应的delete记录 当update一条记录时,它记录一条对应相反的udpate记录 1.2 一致性

Java 事务机制

杀马特。学长 韩版系。学妹 提交于 2019-12-15 14:06:29
Java 事务机制 标签(空格分隔): jdbc 事务 java 事务的属性 原子性:对数据要么不修改,要么修改全部执行 一致性:事务执行前后数据状态不发生改变 隔离性:一个事务的处理结果不能影响另一个事务的处理 持续性: 事务处理结束,其效果在数据库中持久化。 隔离及隔离级别 读未提交是指,一个事务还没提交时,它做的变更就能被别的事务看到。 读提交是指,一个事务提交之后,它做的变更才会被其他事务看到。 可重复读是指, 一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。 当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。 串行化,顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。 Oracle 数据库默认的隔离级别是“读提交”,因此,对于Oracle迁移到Mysql的应用,为保证数据库隔离级别的一致,要将Mysql的隔离级别设置为“读提交”。 事务中可能出现的问题 脏读 事务A读取了事务B未提交的数据,事务B发生错误进行回滚。 不可重复读 事务A的操作导致事务B在操作过程中两次读的数据不一致。 幻读 事务A查询到的内容之后,事务B 新增 了能匹配A查询的内容,使得事务A的两次查询不一致。 不可重复读针对的是update跟delete,幻读针对的是insert

Mysql全局锁、表锁和Innodb行锁

二次信任 提交于 2019-12-15 12:35:59
锁 数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。 根据加锁的范围,MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类。 全局锁 全局锁就是对整个数据库实例加锁。MySQL提供了一个加全局读锁的方法,命令是Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。 全局锁的典型使用场景是,做全库逻辑备份 。也就是把整库每个表都select出来存成文本。 让整库都只读,听上去就很危险: 如果你在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆; 如果你在从库上备份,那么备份期间从库不能执行主库同步过来的binlog,会导致主从延迟。 官方自带的逻辑备份工具是mysqldump。当mysqldump使用参数–single-transaction的时候,导数据之前就会启动一个事务,来确保拿到一致性视图。而由于MVCC的支持,这个过程中数据是可以正常更新的。 对于全部是InnoDB引擎的库,我建议你选择使用–single-transaction参数,对应用会更友好。

MySQL锁详解

◇◆丶佛笑我妖孽 提交于 2019-12-15 08:57:13
MySQL锁详解 一、概述 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则。对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL自然也不能例外。MySQL数据库由于其自身架构的特点,存在多种数据存储引擎,每种存储引擎所针对的应用场景特点都不太一样,为了满足各自特定应用场景的需求,每种存储引擎的锁定机制都是为各自所面对的特定场景而优化设计,所以各存储引擎的锁定机制也有较大区别。MySQL各存储引擎使用了三种类型(级别)的锁定机制:表级锁定,行级锁定和页级锁定。 1.表级锁定(table-level) 表级别的锁定是MySQL各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现逻辑非常简单,带来的系统负面影响最小。所以获取锁和释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好的避免困扰我们的死锁问题。 当然,锁定颗粒度大所带来最大的负面影响就是出现锁定资源争用的概率也会最高,致使并大度大打折扣。 使用表级锁定的主要是MyISAM,MEMORY,CSV等一些非事务性存储引擎。 2.行级锁定(row-level) 行级锁定最大的特点就是锁定对象的颗粒度很小,也是目前各大数据库管理软件所实现的锁定颗粒度最小的。由于锁定颗粒度很小,所以发生锁定资源争用的概率也最小

MySQL事务隔离级别和MVCC

北慕城南 提交于 2019-12-15 04:14:29
事前准备 为了故事的顺利发展,我们需要创建一个表: CREATE TABLE t ( id INT PRIMARY KEY, c VARCHAR(100) ) Engine=InnoDB CHARSET=utf8; 复制代码 然后向这个表里插入一条数据: INSERT INTO t VALUES(1, '刘备' ); 复制代码 现在表里的数据就是这样的: mysql> SELECT * FROM t; +----+--------+ | id | c | +----+--------+ | 1 | 刘备 | +----+--------+ 1 row in set (0.01 sec) 复制代码 隔离级别 MySQL 是一个服务器/客户端架构的软件,对于同一个服务器来说,可以有若干个客户端与之连接,每个客户端与服务器连接上之后,就可以称之为一个会话( Session )。我们可以同时在不同的会话里输入各种语句,这些语句可以作为事务的一部分进行处理。不同的会话可以同时发送请求,也就是说服务器可能同时在处理多个事务,这样子就会导致不同的事务可能同时访问到相同的记录。我们前边说过事务有一个特性称之为 隔离性 ,理论上在某个事务对某个数据进行访问时,其他事务应该进行排队,当该事务提交之后,其他事务才可以继续访问这个数据。但是这样子的话对性能影响太大,所以设计数据库的大叔提出了各种 隔离级别

Spring五个事务隔离级别和七个事务传播行为

跟風遠走 提交于 2019-12-15 04:02:19
转至https://www.cnblogs.com/wj0816/p/8474743.html 脏读 :脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。 不可重复读 :是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两 次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不 可重复读。例如,一个编辑人员两次读取同一文档,但在两次读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已更改。原始读取不可重复。如果 只有在作者全部完成编写后编辑人员才可以读取文档,则可以避免该问题。spacer.gif …数据库事务和Spring事务是一般面试都会被提到,很多朋友写惯了代码,很少花时间去整理归纳这些东西,结果本来会的东西,居然吞吞吐吐答不上来。 下面是我收集到一些关于Spring事务的问题,希望能帮助大家过关。 幻读 : 是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。 同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么

MySQL面试总结

浪尽此生 提交于 2019-12-14 20:29:18
MySQL面试总结 # MySQL的存储引擎 `MyISAM`(默认表类型):非事务的存储引擎,基于传统的`ISAM`(有索引的顺序访问方法)类型,是存储记录和文件的标准方法,不是事务安全,不支持外键,适用于频繁的查询。表锁,不会出现死锁,适合小数据和小并发。 - 为什么不会出死锁?(没有事务就不会继续持有锁) 答:因为`MyISAM`再查询的时候,会同时锁定这个`sql`里面所有用到的表(获取锁的顺序是一致的),不局限与一张表,再写锁又重叠时,就得等待。 **注意:【`MySQL5.5`之前默认的是`MyISAM`引擎了,5.5之后的版本默认都是`innodb`作为存储引擎】** `innodb`:支持事务安全的存储引擎,适用于插入和更新,支持外键,行锁,事务。适合大数据,大并发。特别是针对多个并发和`QPS`较高的情况。 - `QPS:`就是每秒查询率,`QPS`是对一个特定服务器再规定时间内能处理多少流量的衡量标准。 - `TPS:`就是每秒传输处理的事务个数。 - `innodb`的行锁模式:共享锁,排他锁,意向共享锁(表锁),意向排他锁(表锁),间隙锁。(注意:如果`sql`语句没有使用索引,`innodb`不能确定操作的行时,使用意向锁(表锁))。 - 死锁问题 - 什么是死锁? 死锁就是当俩个事务都需要获取对方持有的排他锁才能完成事务的时候,就导致了循环锁等待

Spring框架(AOP、JDBCTemplate、事务控制)

纵饮孤独 提交于 2019-12-14 05:52:26
银行转账案例分析 在更新转入账户和转出账户时,中间加上这句: 造成:虽然报错,但是数据库更新了部分数据 再来看看QueryRunner的配置: <!--配置QueryRunner--> <bean id="runner" class="org.apache.commons.dbutils.QueryRunner" scope="prototype"> <!--注入数据源--> <constructor-arg name="ds" ref="dataSource"></constructor-arg> </bean> 可以看到,每一次与数据库进行交互,都会产生一个Runner. 一个函数里面所有的操作,都应该由一个Connection来操作: 解决方法:让业务层实现业务的回滚 定义Utils.ConnectionUtils.java,连接的工具类,用于从数据源中获取一个链接,并且实现和线程的绑定: public Connection getThreadConnection(){ //1、先从ThreadLocal上获取 Connection conn = tl.get(); //2、判断当前线程上是否有链接 if(conn == null){ //从数据源中获取一个链接,和线程绑定,存入ThreadLocal中 conn = datasource.getConnection();

MySQL索引优化+慢查询定位

a 夏天 提交于 2019-12-13 20:58:11
一、先谈谈事务 1. ACID特性 1.1 原子性 : 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用; 1.2 一致性 : 执行事务前后,数据库从一个一致性状态转换到另一个一致性状态。 1.3 隔离性 : 并发访问数据库时,一个用户的事物不被其他事务所干扰,各并发事务之间数据库是独立的; 1.4 持久性 : 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库 发生故障也不应该对其有任何影响。 2. 事务隔离级别 2.1 READ_UNCOMMITTED(未提交读) : 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读 2.2 READ_COMMITTED(提交读) : 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生 2.3 REPEATABLE_READ(可重复读) : 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。 2.4 SERIALIZABLE(串行) : 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。 Mysql 默认采用的