Mysql默认事务隔离级别是:REPEATABLE-READ

--查询当前会话事务隔离级别
mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)
--全局查询
mysql> select @@global.tx_isolation;
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| REPEATABLE-READ |
+-----------------------+
1 row in set (0.00 sec) mysql>
修改事务权限的语句是:set [ global | session ] transaction isolation level Read uncommitted | Read committed | Repeatable | Serializable;
列:set global transaction isolation level Read committed
mysql> show variables like 'tx_isolation';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| tx_isolation | REPEATABLE-READ |
+---------------+-----------------+
1 row in set, 1 warning (0.00 sec) mysql> set @@session.tx_isolation='serializable';
Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'tx_isolation';
+---------------+--------------+
| Variable_name | Value |
+---------------+--------------+
| tx_isolation | SERIALIZABLE |
+---------------+--------------+
1 row in set, 1 warning (0.00 sec) mysql>

事务隔离分析

请参考文章:http://www.zsythink.net/archives/1233

1.可重复读分析(Repeatable-read)

举例:
  A,B两个事务同时开启,事务A插入一条数据后提交事务,此时事务B所在会话是查不到A录入的数据的,但是会话B此时执行更新操作(包括了A录入的数据)时,会话B会看到A录入的那条数据.
总结:同样的SQL查询,多出一条数据,即产生幻读
--会话A-事务A
mysql> begin;
Query OK, 0 rows affected (0.00 sec) mysql> select * from user;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | 小二 | 11 |
| 2 | 小三 | 12 |
| 3 | 小四 | 22 |
+----+------+------+
3 rows in set (0.00 sec) mysql> insert into user (name,age) values ('小五',55);
Query OK, 1 row affected (0.01 sec) mysql> commit;
Query OK, 0 rows affected (0.08 sec) mysql> select * from user;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | 小二 | 11 |
| 2 | 小三 | 12 |
| 3 | 小四 | 22 |
| 4 | 小五 | 55 |
+----+------+------+
4 rows in set (0.00 sec) mysql>
--会话B,事务B
mysql> begin;
Query OK, 0 rows affected (0.00 sec) mysql> select * from user;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | 小二 | 11 |
| 2 | 小三 | 12 |
| 3 | 小四 | 22 |
+----+------+------+
3 rows in set (0.00 sec) mysql> select * from user;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | 小二 | 11 |
| 2 | 小三 | 12 |
| 3 | 小四 | 22 |
+----+------+------+
3 rows in set (0.00 sec) mysql> update user set age=111 where id=1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from user;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | 小二 | 111 |
| 2 | 小三 | 12 |
| 3 | 小四 | 22 |
+----+------+------+
3 rows in set (0.00 sec) mysql> update user set age=11 ;
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4 Changed: 4 Warnings: 0 mysql> select * from user;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | 小二 | 11 |
| 2 | 小三 | 11 |
| 3 | 小四 | 11 |
| 4 | 小五 | 11 |
+----+------+------+
4 rows in set (0.00 sec) mysql>

2.串行化分析(Serializable )

举例:
事务A,B,事务A对表user执行删除操作,事务B查询表user会导致超时.事务A提交后,B顺利完成查询.
总结:串行化没有并发处理能力,谨慎使用
mysql> begin;
Query OK, 0 rows affected (0.00 sec) mysql> delete from user where id=5;
Query OK, 1 row affected (0.01 sec) mysql> select * from user;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | 小二 | 11 |
| 2 | 小三 | 11 |
| 3 | 小四 | 11 |
| 4 | 小五 | 11 |
+----+------+------+
4 rows in set (0.00 sec) mysql> commit;
Query OK, 0 rows affected (0.04 sec) mysql>
mysql> begin;
Query OK, 0 rows affected (0.00 sec) mysql> select * from user;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | 小二 | 11 |
| 2 | 小三 | 11 |
| 3 | 小四 | 11 |
| 4 | 小五 | 11 |
| 5 | 小六 | 66 |
+----+------+------+
5 rows in set (0.00 sec) mysql> commit;
Query OK, 0 rows affected (0.00 sec) mysql> begin;
Query OK, 0 rows affected (0.00 sec) mysql> select * from user;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql>
mysql> select * from user;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | 小二 | 11 |
| 2 | 小三 | 11 |
| 3 | 小四 | 11 |
| 4 | 小五 | 11 |
+----+------+------+
4 rows in set (0.00 sec) mysql>

3.读已提交分析(READ-COMMITTED)

总结:出现 幻读、不可重读
mysql> set @@session.tx_isolation='read-committed';
Query OK, 0 rows affected (0.00 sec) mysql> select @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| READ-COMMITTED |
+----------------+
1 row in set (0.00 sec) mysql>

4.读未提交分析(READ-UNCOMMITTED)

总结:隔离性最低,会导致 幻读、不可重读、脏读
脏读:当前事务能看到其他事务中未提交的数据
mysql> set @@session.tx_isolation='read-uncommitted';
Query OK, 0 rows affected (0.00 sec) mysql> select @@tx_isolation;
+------------------+
| @@tx_isolation |
+------------------+
| READ-UNCOMMITTED |
+------------------+
1 row in set (0.00 sec) mysql>

脏读、幻读、不可重读

脏读:当前事务可查看其他事务未提交的数据(重点是未提交)
幻读:同一SQL再执行,会多出或者少了一部分数据(重点在增加、减少)
不可重读:同一事务,查询相同数据范围,数据被更改(重点在更改)

Spring中的事务有个默认值Default,默认使用数据库的事务隔离级别

package org.springframework.transaction.annotation;

public enum Isolation {
DEFAULT(-1),
READ_UNCOMMITTED(1),
READ_COMMITTED(2),
REPEATABLE_READ(4),
SERIALIZABLE(8); private final int value; private Isolation(int value) {
this.value = value;
} public int value() {
return this.value;
}
}

项目中的设置

事务隔离界别越高,并发性越弱,而过低的级别存在安全问题,所以项目中事务隔离级别多设置为 READ_COMMITTED

不可重复与幻读

不可重复读和幻读的区别
很多人容易搞混不可重复读和幻读,确实这两者有些相似。但不可重复读重点在于update和delete,而幻读的重点在于insert。 如果使用锁机制来实现这两种隔离级别,在可重复读中,该sql第一次读取到数据后,就将这些数据加锁,其它事务无法修改这些数据,就可以实现可重复读了。
但这种方法却无法锁住insert的数据,所以当事务A先前读取了数据,或者修改了全部数据,事务B还是可以insert数据提交,这时事务A就会发现莫名其妙多了一条之前没有的数据,这就是幻读,不能通过行锁来避免。
需要Serializable隔离级别 ,读用读锁,写用写锁,读锁和写锁互斥,这么做可以有效的避免幻读、不可重复读、脏读等问题,但会极大的降低数据库的并发能力。

Repeatable Read隔离级别下 间隙锁避免了幻读

参考博客原文:https://www.cnblogs.com/crazylqy/p/7821481.html

表user中 主键id,age添加了索引,可以看到,在左边事务未提交之前,是看不到右侧事务添加的数据的。间隙锁避免了幻读

Mysql 事务隔离级别分析的更多相关文章

  1. [51CTO]新说MySQL事务隔离级别!

    新说MySQL事务隔离级别! 事务隔离级别这个问题,无论是校招还是社招,面试官都爱问!然而目前网上很多文章,说句实在话啊,我看了后我都怀疑作者弄懂没!本文所讲大部分内容,皆有官网作为佐证,因此对本文内 ...

  2. 查询mysql事务隔离级别

    查询mysql事务隔离级别 查询mysql事务隔离级别 分类: DB2011-11-26 13:12 2517人阅读 评论(0) 收藏 举报 mysqlsessionjava   1.查看当前会话隔离 ...

  3. MySQL事务隔离级别测试实例

    https://www.cnblogs.com/huanongying/p/7021555.html MySQL事务隔离级别 事务隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommit ...

  4. Mysql事务-隔离级别

    MYSQL事务-隔离级别 事务是什么? 事务简言之就是一组SQL执行要么全部成功,要么全部失败.MYSQL的事务在存储引擎层实现. 事务都有ACID特性: 原子性(Atomicity):一个事务必须被 ...

  5. MySQL事务隔离级别 解决并发问题

    MySQL事务隔离级别 1. 脏读: 骗钱的手段, 两个窗口或线程分别调用数据库转账表,转账后未提交,对方查看到账后,rollback,实际钱没转. 演示方法: mysql默认的事务隔离级别为repe ...

  6. mysql事务隔离级别、脏读、幻读

    Mysql事务隔离级别本身很重要,再加上可能是因为各大公司面试必问的缘故,在博客中出现的概率非常高,但不幸的是,中国的技术博客要么是转载,要么是照抄,质量参差不齐,好多结论都是错的,对于心怀好奇之心想 ...

  7. mysql事务隔离级别与设置

    mysql数据库,当且仅当引擎是InnoDB,才支持事务: 1.隔离级别 事务的隔离级别分为:未提交读(read uncommitted).已提交读(read committed).可重复读(repe ...

  8. MySQL事务隔离级别(二)

    搞清楚MySQL事务隔离级别 首先创建一个表 account.创建表的过程略过(由于 InnoDB 存储引擎支持事务,所以将表的存储引擎设置为 InnoDB).表的结构如下: 为了说明问题,我们打开两 ...

  9. MySQL事务隔离级别(一)

    本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做 ...

随机推荐

  1. 为什么maven没有.m2文件

    该问题可能描述不清,建议你重新提问 为什么maven没有.m2文件 彼岸之恋°DD | 浏览 4793 次 问题未开放回答 2016-09-23 17:29 最佳答案 对于初学者在安装配置好maven ...

  2. [Write-up]-pwnlab_init

    关于 下载地址点我 Flag: /root/flag.txt 放假的第一天 哔哩哔哩视频 信息收集 nmap -sn 192.168.7.1/24 Starting Nmap 7.01 ( https ...

  3. 巧用DOS命令合并多个文本文件的内容

    假设,在网上下载了一本小说.这本小说是由100多个文本文件组成的.这个时候,将这100多个文本文件的内容全部合并到一个文本文件中,阅读起来就会显得很方便     (1)首先,使用本书中“批量按序更改文 ...

  4. UI的考核方式之【主题颜色 + 主题字体 + 主题样式】

    首先,项目中的颜色需要怎么管理呢? 宏?常量? 宏的值可以被改变,不用宏.那就用常量.那常量的名字怎么去起名呢? WSFConstants_Color_0xCCCCCC? WSFConstants_C ...

  5. 洛谷 P1263 宫廷守卫

    被这道题折腾了 \(2\) 个小时. 按照题意,每个守卫的上下左右四个方向上应当都是墙,而不能出现其他的守卫. 如图是一个合法的放置方案.每个守卫四个方向上都是墙(包括宫廷外墙). 如图是一个非法的放 ...

  6. python组合数据类型和数据结构

    //2019.12-071.pyhton里面组合数据类型主要有三种:集合(set).序列(字符串str.列表list and 元组tuple)和映射(字典dic)2.集合类型一般使用大括号{}来进行表 ...

  7. KALI 2017 X64安装到U盘

    KALI 2017 X64安装到U盘启动(作者:黑冰) 此方法为虚拟机方法,自认为成功率很高,已经成功安装过16,32G U盘​,但也不排除有些人用拷碟方法安装这里我仅介绍虚拟机安装方法. ​1.准备 ...

  8. 【Unity】稍微说一下关于各种坐标的转换。比如WorldToScreenPoint

    之前写了一篇关于在物体头顶上显示名字的随笔. 估计难懂的点就在各种坐标的转换. 这里详细(就我这水平,怎么可能详细~~~)解说一下.额............. 用另一种方式举个栗子吧. 还是实现在物 ...

  9. JAVA开源爬虫列表及简介

    本文列举了一些较为常用的JAVA开源爬虫框架: 1.Apache Nutch 官方网站:http://nutch.apache.org/ 是否支持分布式:是 可扩展性:中.Apache Nutch并不 ...

  10. Mozilla Firefox 将获得包含 Tor 模式的扩展组件

    据外媒报道,Firefox 浏览器可能很快就会收到一个 Tor 模式的附加组件,它将通过连接 Tor 网络显著增强隐私功能.虽然 Mozilla 和 Tor 团队的最终目标是在浏览器上实现完整功能的 ...