• 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语句,或一个独立工作单元

    事务遵循ACID原则:

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

      事务的生命周期

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

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

      autocommit = {OFF|ON} 开启或关闭自动提交,建议使用显式请求和提交事务,而不要使用
      “自动提交”功能 永久修改编辑vim /etc/my.cnf

      启动事务:start transactions;

      插入标签:rollback to ##; 

      撤销回指定标签:rollback to ##;

      全部撤销:rollback;

      提交事务:commit;

      删除标签:releaase  savepoint;  

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

      事务的隔离级别

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

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

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

        MariaDB [school]> SELECT @@tx_isolation;   #默认为可重复读级别
        +-----------------+
        | @@tx_isolation  |
        +-----------------+
        | REPEATABLE-READ |
        +-----------------+
        MariaDB [hellodb]> SET tx_isolation='READ-UNCOMMITTED';
        MariaDB [hellodb]> set tx_isolation='READ-COMMITTED';
        MariaDB [hellodb]> set tx_isolation='REPEATABLE-READ';
        MariaDB [hellodb]> set tx_isolation='SERIALIZABLE';

        死锁

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

        在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 [hellodb]> SHOW PROCESSLIST;

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

  • 相关阅读:
    (转帖) oracle是否归档模式及修改模式
    (转帖) Oracle实例恢复(Oracle instance recovery)
    实习第一周总结
    UML类图几种关系的总结
    表格排序
    利用js查找页面中的内链,外链
    事件机制(事件冒泡与事件捕获)
    谈 CSS 模块化
    初学后台框架总结篇二——快速了解CI框架
    初学后台框架总结篇一——学习过程
  • 原文地址:https://www.cnblogs.com/yaun1498078591/p/9172514.html
Copyright © 2020-2023  润新知