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

目录
  • 一、并发访问控制
  • 二、事务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、事务的生命周期

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

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

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并发控制内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解MySQL多版本并发控制机制(MVCC)源码

    目录 一.前言 二.MVCC(多版本并发控制机制) 2.1.Repeatable Read 2.2.Read Commit 2.3.MVCC的优势 三.MVCC(实现机制) 3.1.select运行栈 3.2.read_view的创建过程 3.3.行版本可见性 3.4.undolog搜索可见版本的过程 3.5.read_view创建时机再讨论 四.MVCC和锁的同时作用导致的一些现象 五.总结 一.前言 作为一个数据库爱好者,自己动手写过简单的SQL解析器以及存储引擎,但感觉还是不够过瘾.<<

  • mysql并发控制原理知识点

    Mysql是主流的开源关系型数据库,提供高性能的数据存储服务.在做后端开发时,有时会遇到性能瓶颈,这些瓶颈有时并不是来自应用本身,而是来自数据库层面. 所以所以掌握Mysql的一些底层原理有助于我们更好地理解Mysql,对Mysql进行性能调优, 从而开发高性能的后端服务. 1.mysql的逻辑框架 mysql逻辑框架图如下: 最上层是处理客户端过来的连接的. 主要做连接处理.授权认证.安全等.Mysql在这一层维护了一个线程池,用于处理来自客户端的连接.Mysql可以使用用户名密码认证, 也可

  • MySQL 四种事务隔离级别详解及对比

    MySQL 四种事务隔离级别详解及对比 按照SQL:1992 事务隔离级别,InnoDB默认是可重复读的(REPEATABLE READ).MySQL/InnoDB 提供SQL标准所描述的所有四个事务隔离级别.你可以在命令行用--transaction-isolation选项,或在选项文件里,为所有连接设置默认隔离级别. 例如,你可以在my.inf文件的[mysqld]节里类似如下设置该选项: transaction-isolation = {READ-UNCOMMITTED | READ-CO

  • MySQL四种事务隔离级别详解

    本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样.也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位. 2.一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 .比如A向B转账,不可能A扣了钱,

  • MySQL中大对象的多版本并发控制详解

    MySQL 8.0:InnoDB中大对象的MVCC 在本文中,我将解释MySQL InnoDB存储引擎中大对象(LOB)设计的多版本并发控制(MVCC) . MySQL 8.0有一个新功能,允许用户部分更新大型对象,包括JSON文档 . 使用此部分更新功能,当LOB部分更新时,MVCC对LOB的工作方式已发生变化. 对于正常更新(完整更新),MVCC将像以前的版本一样工作. 让我们看一下MVCC在不涉及部分更新时的工作原理,然后考虑对LOB进行部分更新的用例. MVCC 常规更新 我使用术语常规

  • mysql多版本并发控制MVCC的实现

    事务隔离级别设置 set global transaction isolation level read committed; //全局的 set session transaction isolation level read committed; //当前会话 修改事务提交方式(是否自动提交,mysql默认自动提交) SET AUTOCOMMIT = 1; //自动提交,为0手动提交 不同数据库引擎MVCC模式各不相同,典型有乐观和悲观并发控制. innodb 说明: InnoDB的MVCC

  • MySQL数据库事务隔离级别介绍(Transaction Isolation Level)

    数据库隔离级别有四种,应用<高性能mysql>一书中的说明: 然后说说修改事务隔离级别的方法: 1.全局修改,修改mysql.ini配置文件,在最后加上 复制代码 代码如下: #可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE. [mysqld] transaction-isolation = REPEATABLE-READ 这里全局默认是REPEATABLE-READ,其实MySQL本来默认也是这个级别

  • 深入解析MySQL的事务隔离及其对性能产生的影响

    SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. Read Uncommitted(读取未提交内容)        在该隔离级别,所有事务都可以看到其他未提交事务的执行结果.本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少.读取未提交的数据,也被称之为脏读(Dirty Read). Read Committed(读取提交内容)        这是大多数数据库系统的默认隔离

  • MySQL中Innodb的事务隔离级别和锁的关系的讲解教程

    前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式.同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力.所以对于加锁的处理,可以说就是数据库对于事务处理的精髓所在.这里通过分析MySQL中InnoDB引擎的加锁机制,来抛砖引玉,让读者更好的理解,在事务处理中数据库到底做了什么. 一次封锁or两段锁? 因为有大量的并发访问,为了预防死锁,一般应用中推荐使用一次封锁法,就是在方法的开始阶段,已经预先知道会

  • mysql的MVCC多版本并发控制的实现

    1 什么是MVCC MVCC全称是: Multiversion concurrency control,多版本并发控制,提供并发访问数据库时,对事务内读取的到的内存做处理,用来避免写操作堵塞读操作的并发问题. 举个例子,程序员A正在读数据库中某些内容,而程序员B正在给这些内容做修改(假设是在一个事务内修改,大概持续10s左右),A在这10s内 则可能看到一个不一致的数据,在B没有提交前,如何让A能够一直读到的数据都是一致的呢? 有几种处理方法,第一种: 基于锁的并发控制,程序员B开始修改数据时,

随机推荐