• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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原则:

    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、事务的隔离级别

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

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

    tx_isolation

    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多版本并发控制机制(MVCC)源码
    • mysql的MVCC多版本并发控制的实现
    • MySQL高并发生成唯一订单号的方法实现
    • MySQL 加锁控制并发的方法
    • Mysql事务并发问题解决方案
    • MySQL 数据库如何解决高并发问题
    • mysql并发控制原理知识点
    • mysql多版本并发控制MVCC的实现
    • MySQL并发更新数据时的处理方法
    • Tomcat+Mysql高并发配置优化讲解
    • MySQL 到底是如何做到多版本并发的?
    上一篇:MySQL系列之十一 日志记录
    下一篇:MySQL定时全库备份数据库
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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