并发控制

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

锁分为表级锁和行级锁,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 (,'Tom',,'M'); #添加一条记录
    MariaDB [hellodb]> SAVEPOINT sp26; #插入一个标签
    MariaDB [hellodb]> INSERT students(StuID,Name,Age,Gender) VALUES (,'Maria',,'F'); #再加入一条记录
    MariaDB [hellodb]> SELECT * FROM students WHERE stuid IN (,); #查看一下,可以看到刚刚插入的数据
    +-------+-------+-----+--------+---------+-----------+
    | StuID | Name | Age | Gender | ClassID | TeacherID |
    +-------+-------+-----+--------+---------+-----------+
    | | Tom | | M | NULL | NULL |
    | | Maria | | F | NULL | NULL |
    +-------+-------+-----+--------+---------+-----------+
    MariaDB [hellodb]> ROLLBACK TO sp26; #撤销到sp26标签之前的状态
    MariaDB [hellodb]> SELECT * FROM students WHERE stuid IN (,); #查看一下,刚刚maria的信息被撤回了
    +-------+------+-----+--------+---------+-----------+
    | StuID | Name | Age | Gender | ClassID | TeacherID |
    +-------+------+-----+--------+---------+-----------+
    | | Tom | | M | NULL | NULL |
    +-------+------+-----+--------+---------+-----------+
    MariaDB [hellodb]> COMMIT; #提交事务
    MariaDB [hellodb]> SELECT * FROM students WHERE stuid IN (,); #最终的数据
    +-------+------+-----+--------+---------+-----------+
    | StuID | Name | Age | Gender | ClassID | TeacherID |
    +-------+------+-----+--------+---------+-----------+
    | | Tom | | 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  (): Deadlock found when trying to get lock; try restarting transaction

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

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

mysql—并发控制及事务的更多相关文章

  1. 五分钟详解MySQL并发控制及事务原理

    在如今互联网业务中使用范围最广的数据库无疑还是关系型数据库MySQL,之所以用"还是"这个词,是因为最近几年国内数据库领域也取得了一些长足进步,例如以TIDB.OceanBase等 ...

  2. 《高性能MySQL》读书笔记之 MySQL锁、事务、多版本并发控制的基础知识

    1.2 并发控制 1.2.1 读写锁 在处理并发读或写时,通过实现一个由两种类型的锁组成的锁系统来解决问题.这两种类型的锁通常被称为 共享锁(shared lock) 和 排它锁(exclusive ...

  3. [转帖]2019-03-26 发布 深入理解 MySQL ——锁、事务与并发控制

    深入理解 MySQL ——锁.事务与并发控制 https://segmentfault.com/a/1190000018658828 太长了 没看完.. 数据库 并发  mysql 639 次阅读   ...

  4. [转帖]深入理解 MySQL—锁、事务与并发控制

    深入理解 MySQL—锁.事务与并发控制 http://www.itpub.net/2019/04/28/1723/ 跟oracle也类似 其实所有的数据库都有相同的机制.. 学习了机制才能够更好的工 ...

  5. 深入理解Mysql——锁、事务与并发控制

    本文对锁.事务.并发控制做一个总结,看了网上很多文章,描述非常不准确.如有与您观点不一致,欢迎有理有据的拍砖! mysql服务器逻辑架构 每个连接都会在mysql服务端产生一个线程(内部通过线程池管理 ...

  6. 【MySQL】漫谈MySQL中的事务及其实现

    最近一直在做订单类的项目,使用了事务.我们的数据库选用的是MySQL,存储引擎选用innoDB,innoDB对事务有着良好的支持.这篇文章我们一起来扒一扒事务相关的知识. 为什么要有事务? 事务广泛的 ...

  7. MySQL数据库的事务管理

    当前在开发ERP系统,使用到的数据库为Mysql.下面介绍下如何开启事务,以及事务隔离的机制 : 1. 检查当前数据库使用的存储引擎. show engines; 2. 修改前my.ini中的文件如下 ...

  8. 漫谈MySql中的事务

    最近一直在做订单类的项目,使用了事务.我们的数据库选用的是MySql,存储引擎选用innoDB,innoDB对事务有着良好的支持.这篇文章我们一起来扒一扒事务相关的知识. 为什么要有事务? 事务广泛的 ...

  9. mysql中不同事务隔离级别下数据的显示效果--转载

    事务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查询语句因为崩溃或其他原因而无法执行,那么所有的语句就都 ...

随机推荐

  1. vue 2.0 + 如何实现加入购物车,小球飞入的动画

    github源码地址:https://github.com/13476075014/node-vue/tree/master/mynodeproject/13.sell/sell 在移动端经常会有加入 ...

  2. [Vuex系列] - Vuex中的getter的用法

    Vuex 允许我们在store中定义“getter”(可以认为是store的计算属性).就像计算属性一样,getter的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算. g ...

  3. flutter packages get 慢 解决方案

    国内使用 flutter packages get 命令,一直是  This is taking an unexpectedly long time 状态 科.学.上.网.无.效. windows解决 ...

  4. stm32 ADC模数转换 ADC多通道 ADC DMA

    通过调节电位器,改变AD转换值和电压值 STM32F1 ADC 配置步骤 1.使能GPIO时钟和ADC时钟 2.配置引脚模式为模拟输入 3.配置ADC的分频因子 4.初始化ADC参数,ADC_Init ...

  5. CentOS linux7 设置开机启动服务

    常用命令 描述                                 旧命令  新命令 使服务自动启动          chkconfig --level 3 http on  syste ...

  6. flex布局实战

    1.实现盒子的水平垂直居中 .parent{ width:200px; height:200px; display:flex; align-items: center; justify-content ...

  7. Mount 使用方法

    NAME mount - 挂载文件系统 SYNOPSIS 总览 mount [-lhV] mount -a [-fFnrsvw] [-t vfstype] [-O optlist] mount [-f ...

  8. 1.使用Vue.js实现品牌案例添加功能

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. jQuery属性遍历、HTML操作

    jQuery 拥有可操作 HTML 元素和属性的强大方法. jQuery 遍历函数 jQuery 遍历函数包括了用于筛选.查找和串联元素的方法.    .add() 将元素添加到匹配元素的集合中. . ...

  10. C#当中使用async和await

    最近在写程序的时候,经常遇到大量需要异步访问的情况,但是对于async和await到底怎么写,还不是非常明确.于是参考<C#图解教程>了异步编程一节. 1.普通的程序怎么写? class ...