MySQL系列之十 MySQL事务隔离实现并发控制


Posted in MySQL onJuly 02, 2021
目录
  • 一、并发访问控制
  • 二、事务Transactions
    • 1、事务遵循ACID原则:
    • 2、事务的生命周期
    • 3、事务的隔离级别
    • 4、死锁

 

一、并发访问控制

实现的并发访问的控制技术是基于锁;

锁分为表级锁和行级锁,MyISAM存储引擎不支持行级锁;InnoDB支持表级锁和行级锁;

锁的分类有读锁和写锁,读锁也被称为共享锁,加读锁的时候其他的人可以读;写锁也称为独占锁或排它锁,一个写锁会阻塞其他读操作和写操作;

锁还分为隐式锁和显式锁,隐式锁由存储引擎自行管理,显式锁是用户手动添加锁;

锁策略:在锁粒度及数据安全性寻求的平衡机制。

显式锁的使用方法:LOCK TABLES tbl_name READ|WRITE

MariaDB [school]> LOCK TABLES students READ;  #加读锁
MariaDB [school]> UNLOCK TABLES;  #解锁

读锁:任何人都不可写

写锁:自己可以读写,但是其他人不可读写

FLUSH TABLES tb_name :关闭正在打开的表(清除查询缓存),通常在备份前加全局读锁

SELECT clause [FOR UPDATE | LOCK IN SHARE MODE] 查询时加写或读锁

 

二、事务Transactions

​一组原子性的SQL语句,或一个独立工作单元

 

1、事务遵循ACID原则:

  • A:atomicity原子性;整个事务中的所有操作要么全部成功执行,要么全部失败后回滚
  • C:consistency一致性;数据库总是从一个一致性状态转换为另一个一致性状态
  • I:Isolation隔离性;一个事务所做出的操作在提交之前,是不能为其它事务所见;隔离有多种隔离级别,实现并发
  • D:durability持久性;一旦事务提交,其所做的修改会永久保存于数据库中

 

2、事务的生命周期

MySQL系列之十 MySQL事务隔离实现并发控制

显式事务:明确的规定事务的开始

隐式事务:默认为隐式事务,每执行完一句语句后直接提交

autocommit = {OFF|ON} 开启或关闭自动提交,建议使用显式请求和提交事务,而不要使用“自动提交”功能

启动事务:START TRANSACTION;

插入标签:ROLLBACK TO ##;

撤销回指定标签:ROLLBACK TO ##;

全部撤销:ROLLBACK;

提交事务:COMMIT;

删除标签:RELEASE SAVEPOINT;

MariaDB [school]> START TRANSACTION;  #明确指明启动一个事务
MariaDB [school]> INSERT students(StuID,Name,Age,Gender) VALUES (26,'Tom',22,'M');  #添加一条记录
MariaDB [school]> SAVEPOINT sp26;  #插入一个标签
MariaDB [school]> INSERT students(StuID,Name,Age,Gender) VALUES (27,'Maria',12,'F');  #再加入一条记录
MariaDB [school]> SELECT * FROM students WHERE stuid IN (26,27);  #查看一下,可以看到刚刚插入的数据
+-------+-------+-----+--------+---------+-----------+
| StuID | Name  | Age | Gender | ClassID | TeacherID |
+-------+-------+-----+--------+---------+-----------+
|    26 | Tom   |  22 | M      |    NULL |      NULL |
|    27 | Maria |  12 | F      |    NULL |      NULL |
+-------+-------+-----+--------+---------+-----------+
MariaDB [school]> ROLLBACK TO sp26;  #撤销到sp26标签之前的状态
MariaDB [school]> SELECT * FROM students WHERE stuid IN (26,27);  #查看一下,刚刚maria的信息被撤回了
+-------+------+-----+--------+---------+-----------+
| StuID | Name | Age | Gender | ClassID | TeacherID |
+-------+------+-----+--------+---------+-----------+
|    26 | Tom  |  22 | M      |    NULL |      NULL |
+-------+------+-----+--------+---------+-----------+
MariaDB [school]> COMMIT;  #提交事务
MariaDB [school]> SELECT * FROM students WHERE stuid IN (26,27);  #最终的数据
+-------+------+-----+--------+---------+-----------+
| StuID | Name | Age | Gender | ClassID | TeacherID |
+-------+------+-----+--------+---------+-----------+
|    26 | Tom  |  22 | M      |    NULL |      NULL |
+-------+------+-----+--------+---------+-----------+

 

3、事务的隔离级别

  • READ UNCOMMITTED 其他事务可以看到未提交的脏数据,产生脏读
  • READ COMMITTED 提交后其他事务可以看到修改后的数据,每次读取的数据可能不一致,不可重复读
  • REPEATABLE READ 可重复读,每次看到的数据都一致,数据被修改后看不到最新数据,会产生幻读(默认设置)
  • SETIALIZABILE 未提交的读事务阻塞修改事务,串行执行,并发性差

MVCC: 多版本并发控制,和事务级别相关

MySQL系列之十 MySQL事务隔离实现并发控制

修改事务隔离级别:服务器变量tx_isolation指定,默认为REPEATABLE-READ,可在GLOBAL和SESSION级进行设置

tx_isolation

  • Description: The transaction isolation level. See also SET TRANSACTION ISOLATION LEVEL.
  • Commandline: --transaction-isolation=name
  • Scope: Global, Session
  • Dynamic: Yes
  • Type: enumeration
  • Default Value: REPEATABLE-READ
  • Valid Values: READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE
MariaDB [school]> SELECT @@tx_isolation;   #默认为可重复读级别
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
MariaDB [school]> SET tx_isolation='READ-UNCOMMITTED';
MariaDB [school]> set tx_isolation='READ-COMMITTED';
MariaDB [school]> set tx_isolation='REPEATABLE-READ';
MariaDB [school]> set tx_isolation='SERIALIZABLE';

 

4、死锁

​两个或多个事务在同一资源相互占用,并请求锁定对方占用的资源的状态会发生死锁

在A事务修改t1表的第3行,B事务修改t2表的第2行时;这时A事务去修改t2表的第2行,这时就把A事务阻塞了,然后B事务有刚刚好去修改t1表的第3行,这时B事务也被阻塞了,这时就产生了死锁。

俩个事务同时去更改对方的修改的表,互相阻塞;系统会发现死锁,会自动牺牲一个代价小的事务来解开死锁。

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

查看进程列表:MariaDB [school]> SHOW PROCESSLIST;

杀死进程:MariaDB [school]> KILL 5;

到此这篇关于MySQL系列之十 MySQL事务隔离实现并发控制的文章就介绍到这了,更多相关mysql并发控制内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

到此这篇关于MySQL系列之十 MySQL事务隔离实现并发控制的文章就介绍到这了,更多相关mysql并发控制内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL创建索引需要了解的
Apr 08 MySQL
MySQL Shell的介绍以及安装
Apr 24 MySQL
MySQL时间设置注意事项的深入总结
May 06 MySQL
虚拟机linux端mysql数据库无法远程访问的解决办法
May 26 MySQL
解析MySQL binlog
Jun 11 MySQL
面试被问select......for update会锁表还是锁行
Nov 11 MySQL
Linux7.6二进制安装Mysql8.0.27详细操作步骤
Nov 27 MySQL
浅谈如何保证Mysql主从一致
Mar 13 MySQL
MySQL的存储函数与存储过程的区别解析
Apr 08 MySQL
Windows下载并安装MySQL8.0.x 版本的完整教程
Apr 10 MySQL
SQL语句多表联合查询的方法示例
Apr 18 MySQL
MySQL数据库实验实现简单数据库应用系统设计
Jun 21 MySQL
MySQL系列之九 mysql查询缓存及索引
MySQL系列之八 MySQL服务器变量
Jul 02 #MySQL
MySQL系列之四 SQL语法
MySQL系列之七 MySQL存储引擎
Jul 02 #MySQL
MySQL系列之十五 MySQL常用配置和性能压力测试
Jul 02 #MySQL
MySQL系列之三 基础篇
Jul 02 #MySQL
MySQL系列之一 MariaDB-server安装
Jul 02 #MySQL
You might like
CodeIgniter扩展核心类实例详解
2016/01/20 PHP
PHP将英文数字转换为阿拉伯数字实例讲解
2019/01/28 PHP
js tab效果的实现代码
2009/12/26 Javascript
JavaScript 学习初步 入门教程
2010/03/25 Javascript
JQuery实现倒计时按钮具体方法
2013/11/14 Javascript
用js模拟struts2的多action调用示例
2014/05/19 Javascript
JS实现鼠标箭头变成一个燃烧烛光效果的方法
2015/02/28 Javascript
基于jQuery实现美观且实用的倒计时实例代码
2015/12/30 Javascript
详解js的延迟对象、跨域、模板引擎、弹出层、AJAX【附实例下载】
2016/12/19 Javascript
如何使用Bootstrap创建表单
2017/03/29 Javascript
vue.js实现备忘录功能的方法
2017/07/10 Javascript
JS实现分页浏览横向图片(类轮播)实例代码
2017/11/06 Javascript
Vue绑定内联样式问题
2018/10/17 Javascript
用Python编写一个简单的FUSE文件系统的教程
2015/04/02 Python
举例讲解Python中字典的合并值相加与异或对比
2016/06/04 Python
利用python微信库itchat实现微信自动回复功能
2017/05/18 Python
Python数据分析之获取双色球历史信息的方法示例
2018/02/03 Python
Python聊天室程序(基础版)
2018/04/01 Python
python实现在cmd窗口显示彩色文字
2019/06/24 Python
Python计算一个点到所有点的欧式距离实现方法
2019/07/04 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
2019/10/11 Python
Python中BeautifuSoup库的用法使用详解
2019/11/15 Python
python编程进阶之类和对象用法实例分析
2020/02/21 Python
Python爬取YY评级分数并保存数据实现过程解析
2020/06/01 Python
基于TensorFlow的CNN实现Mnist手写数字识别
2020/06/17 Python
Python 通过正则表达式快速获取电影的下载地址
2020/08/17 Python
10种CSS3实现的loading动画,挑一个走吧?
2020/11/16 HTML / CSS
用HTML5 Canvas API中的clearRect()方法实现橡皮擦功能
2016/03/15 HTML / CSS
实习单位推荐信范文
2013/11/27 职场文书
2014社区三八妇女节活动方案
2014/03/30 职场文书
爱心倡议书范文
2014/05/12 职场文书
终止劳动合同协议书
2014/10/05 职场文书
golang在GRPC中设置client的超时时间
2021/04/27 Golang
Python 高级库15 个让新手爱不释手(推荐)
2021/05/15 Python
浅谈Python魔法方法
2021/06/28 Java/Android
电脑开机弹出documents文件夹怎么回事?弹出documents文件夹解决方法
2022/04/08 数码科技