mysql的事务,隔离级别和锁
事务就是一组一起成功或一起失败的sql语句。事务还应该具备,原子性,一致性,隔离性和持久性。
一、事务的基本要素 (ACID)
1、原子性:事务开始后,所有的操作,要么全部成功,要么全部失败,不可能处于中间状态,事务是一个不可分割的整体,就像原子一样。
2、一致性:事务开始前和结束后,数据库的完整性约束没有破坏,A向B转账,A扣了钱,但B却没到账。
3、隔离性:同时发生的事务(并发事务)不应该导致数据库处于不一致的状态中,每个事务都独立执行,不影响其他事务的存在。
4、持久性:事务对数据库的更改都会保存在磁盘上,不会丢失。
二、事务的并发问题
1、脏读:事务A读取了事务B未提交的写入数据,读取到的数据就称为脏数据
2、不可重复读:事务A多次读取同一数据,但在读取过程中,事务B对数据做了修改,并提交了。导致多次读取同一数据,结果不一样。
3、幻读:事务A对表中所有数据行进行了修改,比如设置status = 1,但同时,事务B往该表插入了一行新数据status = 0,对于操作事务A的用户而言,表中还有一条记录没被修改,就像发生幻觉一样。
三、事务隔离性的四个级别
| 事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
| 读取未提交 read uncommitted |
√ |
√ |
√ |
| 读已提交 read committed |
× |
√ |
√ |
| 可重复读取 repeatable read |
× |
× |
√ |
| 序列化 serializable |
× |
× |
× |
四、获取和设置数据库隔离级别
SHOW VARIABLES LIKE '%isolation%';
SHOW GLOBAL VARIABLES LIKE '%isolation%';
使用系统变量查询
SELECT @@GLOBAL.tx_isolation;
SELECT @@SESSION.tx_isolation;
SELECT @@tx_isolation;
对于mysql8而言,使用下面的变量进行查询
SELECT @@GLOBAL.transaction_isolation;
SELECT @@SESSION.transaction_isolation;
SELECT @@transaction_isolation;
设置隔离级别
SET GLOBAL tx_isolation = '隔离级别';
SET SESSION tx_isolation = '隔离级别';
SET @@tx_isolation = '隔离级别';
对于mysql8而言,使用下面语句进行设置
SET GLOBAL transaction_isolation = '隔离级别';
SET SESSION transaction_isolation = '隔离级别';
SET @@transaction_isolation = '隔离级别';
五、通过例子说明各隔离级别的情况
先准备一张表,和一点数据。
CREATE TABLE `account` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
`name` varchar(32) DEFAULT '' COMMENT '名称',
`money` decimal(11,2) DEFAULT '0.00' COMMENT '金钱',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO `account` (`name`, `money`) VALUES ('A', '500.00');
INSERT INTO `account` (`name`, `money`) VALUES ('B', '100.00');
1、读取未提交
set transaction_isolation = 'READ-UNCOMMITTED';
set autocommit = 0;

事务B修改了表中的数据,但是未提交,事务A确读取到了修改后的数据。如果因为某些原因,事务B回滚了,事务A读取的这个数据就是脏数据。
2、读已提交
set transaction_isolation = 'READ-COMMITTED';
set autocommit = 0;

事务B修改数据但没有提交,那么事务A仍然获取的原来数据,解决了脏读的问题。
但是事务B提交,事务A执行上一次查询,结果与上一次查询不一致,这就产生不可重复读的问题。

3、可重复读取
set transaction_isolation = 'REPEATABLE-READ';
set autocommit = 0;

事务B修改了数据并提交了,事务A两次查询的结果是一致的,解决了不可重复读的问题。
这个时候,事务A去修改name为A的money数据

name为A的money变成了350,而不是400,可重复读保证了数据的一致性。
我们重新在事务A中修改所有账号的money等于200,同时在事务B中插入一条新的数据。

事务A中获取的仍然是两条数据,解决了新增数据时,事务A出现的幻读问题。
4、序列化
set transaction_isolation = 'SERIALIZABLE';
set autocommit = 0;

事务A对表进行查询,如果没有提交,则事务B的插入语句一直等待在那里,直到超时或事务A提交。
反之,事务B对表进行插入后,没有提交,则事务A对表的查询也一直等待,直到事务B提交。
此时对表的读写都会进行锁表,当然对并发性能的影响也比较大。
隔离级别越高,越能保证数据的完整性和一致性。
六、mysql的锁
锁分为两种类型:
内部锁:mysql服务器内部执行的内部锁,以管理多个会话对表内容的争用。
外部锁:mysql为客户会话提供显式地获取表锁,以阻止其他会话访问表。
内部锁又会为两种类型:
1、行级锁:行级锁是细粒度的,只有被访问的行会被锁定,这允许多个会话同时进行写访问。
2、表级锁:mysql对myisam,memory和merge表使用表级锁,一次只允许一个会话更新表,这使得这些存储引擎更适用于以读取为主的操作。
外部锁:可以使用 LOCK TABLE 和 UNLOCK TABLE 来控制锁定。
READ (共享锁) :多个会话可以从表中读取数据而不需要获取锁,此外,多个会话可以在同一表上获得锁,当 READ 锁时,没有会话可以将数据写入表中。任何写入操作都将处于等待状态,直到 READ 锁被释放。
WRITE (排他锁) :当表被 WRITE 锁定时,除持有该锁的会话外,其他会话都不能读取或写入数据,除非 WRITE 锁被释放。
锁表的语句:
LOCK TABLES table_name [READ | WRITE];
解锁表的语句:
UNLOCK TABLES;
锁定数据库中所有表:
FLUSH TABLES WITH READ LOCK;
mysql的事务,隔离级别和锁的更多相关文章
- MySql各事务隔离级别及锁问题
聊事务隔离级别和锁问题之前首先得理解事务的隔离级别和共享锁及独占锁的概念: 事务的隔离级别: 脏读 不可重复读 幻读 Read uncommitted √ √ √ Read committed × ...
- MySQL数据库引擎、事务隔离级别、锁
MySQL数据库引擎.事务隔离级别.锁 数据库引擎InnoDB和MyISAM有什么区别 大体区别为: MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调的是性能 ...
- 重新学习MySQL数据库9:Innodb中的事务隔离级别和锁的关系
重新学习MySQL数据库9:Innodb中的事务隔离级别和锁的关系 Innodb中的事务隔离级别和锁的关系 前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁 ...
- mysql事务之一:MySQL数据库事务隔离级别(Transaction Isolation Level)及锁的实现原理
一.数据库隔离级别 数据库隔离级别有四种,应用<高性能mysql>一书中的说明: 然后说说修改事务隔离级别的方法: 1.全局修改,修改mysql.ini配置文件,在最后加上 1 #可选参数 ...
- MySQL事务隔离级别,锁(转)
add by zhj: 本文针对的是MySQL的InnoDB存储引擎,不适用于MySQL的其它存储引擎和其它数据库 原文:MySQL数据库事务隔离级别(Transaction Isolation Le ...
- MySQL之事务隔离级别--转载
转自:http://793404905.blog.51cto.com/6179428/1615550 本文通过实例展示MySQL事务的四种隔离级别. 1 概念阐述 1)Read Uncommitted ...
- MySQL数据库事务隔离级别(Transaction Isolation Level)
转自: http://www.cnblogs.com/zemliu/archive/2012/06/17/2552301.html 数据库隔离级别有四种,应用<高性能mysql>一书中的 ...
- [转]MySQL 数据库事务隔离级别
然后说说修改事务隔离级别的方法: 1. 全局修改,修改 mysql.ini 配置文件,在最后加上 1 #可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATAB ...
- MySQL实战 | 03 - 谁动了我的数据:浅析MySQL的事务隔离级别
原文链接:这一次,带你搞清楚MySQL的事务隔离级别! 使用过关系型数据库的,应该都事务的概念有所了解,知道事务有 ACID 四个基本属性:原子性(Atomicity).一致性(Consistency ...
- Innodb中的事务隔离级别和锁的关系(转载)
nodb中的事务隔离级别和锁的关系 原文:https://tech.meituan.com/innodb-lock.html ameng ·2014-08-20 15:50 前言: 我们都知道事务的几 ...
随机推荐
- unity WegGL 调用js
test.jslib文件,必须放到Assets/Plugins下,这里是:Assets/Plugins/WebGL mergeInto(LibraryManager.library, { Hello: ...
- 437. Path Sum III
原题: 437. Path Sum III 解题: 思路1就是:以根节点开始遍历找到适合路径,以根节点的左孩子节点开始遍历,然后以根节点的右孩子节点开始遍历,不断循环,也就是以每个节点为起始遍历点 代 ...
- trie数的实现
Trie树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用字符串 ...
- Java编译时多态和运行时多态
来源:https://blog.csdn.net/wendizhou/article/details/73733061 编译时多态:主要是方法的重载,通过参数列表的不同来区分不同的方法. 运行时多态: ...
- Oracle中PL/SQL的循环语句
在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LO ...
- js模板引擎用法
JavaScript模板引擎Template.js使用详解 作者:A_山水子农 字体:[增加 减小] 类型:转载 时间:2016-12-15我要评论 这篇文章主要为大家详细介绍了JavaScript模 ...
- Ubuntu下面的docker开启ssh服务
选择主流的openssh-server作为服务端: root@161f67ccad50:/# apt-get install openssh-server -y Reading package lis ...
- bootstrap 固定表头
1 htmL <!DOCTYPE html> <html> <head> <title>Fixed Columns</title> < ...
- springboot 线程池
我们常用ThreadPoolExecutor提供的线程池服务,springboot框架提供了@Async注解,帮助我们更方便的将业务逻辑提交到线程池中异步执行,今天我们就来实战体验这个线程池服务: 本 ...
- Node KeyNote
[Node KeyNote] 1.实际上,.node文件在windows下它是一个.dll文件,在*nix下则是一个.so文件. 2.默认变量 function(exports, require, m ...