并发控制

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

锁分为表级锁和行级锁,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. express 和 vue-cli 的博客网站

    已经上传到github地址:https://github.com/13476075014/node-vue/tree/master/mynodeproject/15.TimeBlog # 个人博客系统 ...

  2. 在textarea和input光标处插入内容,支持ie

    项目需求,用户要能够输入和点击外面的公式去插入到textaera中,试了好几种方法,有的是在谷歌下好使,在ie下不好使,最后找到了下面这个方法,目前在ie8以上都可以生效.直接上代码 function ...

  3. 使用vue国际化中出现内置的组件无法切换语言的问题(element-ui、ivew)

    在main.js中引入对应组件的语言包 eg: import VueI18n from 'vue-i18n'; // 引入国际化 import elementEn from 'element-ui/l ...

  4. JS 学习书籍电子版PDF下载

    JavaScript权威指南(第6版)(中文版) 链接:https://pan.baidu.com/s/1H1v77UY-yh7oDxonRjd0GA 提取码:r3pu JavaScript DOM编 ...

  5. 【小知识点】解决Chrome动画”卡顿”的办法

    为动画DOM元素添加CSS3样式-webkit-transform:transition3d(0,0,0)或-webkit-transform:translateZ(0);这两个属性都会开启GPU硬件 ...

  6. ASE19 团队项目 alpha 阶段 Frontend 组 scrum9 记录

    本次会议于11月14日,11:30 在微软北京西二号楼13158,持续15分钟. 与会人员:Jingyi Xie, Jiaqi Xu, Jingwei Yi, Hanyue Tu 请假: Ziwei ...

  7. LINUX安装Tree软件包

     1.将镜像光盘放入光驱中 查看当前LINUX版本号:cat  /etc/redhat-release 2.挂载镜像文件 mount  /dev/cdrom /mnt mount :挂载设备命令 /d ...

  8. webpack与浏览器缓存

    根据之前的配置,假设文件上传至服务器中,没有加hash,如果页面内容有更改,浏览器刷新的时候,请求的还是原先的文件,也就是浏览器的缓存,因为名字没有变.现在我们在上线的webpack配置中加上hash ...

  9. 使用pyinstaller打包使用scrapy模块的程序运行时出现No such file or directory的问题解决

    解决的方案是利用pyinstaller的hook特性,步骤如下: 1.在项目目录新建hooks目录,目录中新建hooks-scrapy.py 文件,文件内容如下: from PyInstaller.u ...

  10. 【二进制优化-多重背包】zznu-oj-2120 : 安详--如何用尽钱币打赏主播获得最大好感度

    2120 : 安详 题目描述 spring最近喜欢上了B站新秀主播,身为顿顿吃黄焖鸡的土豪,当然要过去打赏一番,但是spring还是喜欢精打细算,所以在打赏的时候,想要掏出有限的钱,获得主播的最大好感 ...