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

 更新时间:2021年07月02日 16:13:40   作者:生生不息.连绵不绝  
今天的内容就和大家聊一聊MySQL数据库中关于MySQL事务隔离实现并发控制的问题,主要是基于锁实现控制技术

一、并发访问控制

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

锁分为表级锁和行级锁,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、事务的生命周期

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

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

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: 多版本并发控制,和事务级别相关

修改事务隔离级别:服务器变量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安装详解图文版(V5.5 For Windows)

    MySQL安装详解图文版(V5.5 For Windows)

    这几年一直在用MySQL,并且是Windows+.Net+MySQL的搭配,用MyISAM引擎支持过单表每天千万以上的数据递增,TB级的数据MySQL游刃有余。
    2011-09-09
  • Mac os 解决无法使用localhost连接mysql问题

    Mac os 解决无法使用localhost连接mysql问题

    今天在mac上搭建好了php的环境,把先前在window、linux下运行良好的程序放在mac上,居然出现访问不了数据库,数据库连接的host用的是localhost,可以确认数据库配置是正确的,下面特为大家分享下
    2014-05-05
  • 详解MySQL 外键约束

    详解MySQL 外键约束

    这篇文章主要介绍了MySQL 外键约束的相关资料,帮助大家更好的理解和学习MySQL,感兴趣的朋友可以了解下
    2020-08-08
  • 探究MySQL中varchar的定义长度

    探究MySQL中varchar的定义长度

    这篇文章主要介绍了探究MySQL中varchar的定义长度,文中主要对其长度究竟是字节还是字符做出了相关实验,需要的朋友可以参考下
    2015-05-05
  • win10下安装两个MySQL5.6.35数据库

    win10下安装两个MySQL5.6.35数据库

    这篇文章主要为大家详细介绍了win10下两个MySQL5.6.35数据库安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • mysql 的indexof函数用法说明

    mysql 的indexof函数用法说明

    这篇文章主要介绍了mysql 的indexof函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • MySQL8.0 DDL原子性特性及实现原理

    MySQL8.0 DDL原子性特性及实现原理

    这篇文章主要介绍了MySQL8.0 DDL原子性特性及实现原理,本文给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-07-07
  • [MySQL binlog]mysql如何彻底解析Mixed日志格式的binlog

    [MySQL binlog]mysql如何彻底解析Mixed日志格式的binlog

    这篇文章主要介绍了mysql彻底解析Mixed日志格式的binlog,需要的朋友可以参考下
    2014-02-02
  • 全面分析MySQL ERROR 1045出现的原因及解决

    全面分析MySQL ERROR 1045出现的原因及解决

    这篇文章主要介绍了全面分析MySQL ERROR 1045出现的原因及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • MySQL 用 limit 为什么会影响性能

    MySQL 用 limit 为什么会影响性能

    对于小的偏移量,直接使用limit来查询没有什么问题,但随着数据量的增大,越往后分页,limit语句的偏移量就会越大,速度也会明显变慢,接下来文章就向大家介绍其的原由,感兴趣的小伙伴可参考下面文章具体内容
    2021-09-09

最新评论