0x01

MySQL锁:
执行操作时施加锁的模式
读锁:用户在读的时候施加的锁,为防止别人修改,但是用户可以读,还被称为共享锁 不会对其他用户进行阻塞

理解: ----->(这里的不阻塞,是可以让用户读(即-不对用户读进行阻塞),但是不能让用户写入数据,是会阻塞写入的数据,除非解锁)

显示锁(表级锁):
lock tables:施加锁
  LOCK TABLES
  tbl_name lock_type
  [, tbl_name lock_type] ...
锁的类型
  READ | WRITE
  unlock tables:解锁

实例:

原表中数据,如下:

对表进行读锁,用其他用户进行查询表内容依然可以进行查询,如下

但是此时若要对表进行写入数据的操作那么 会被阻塞,如下:

若要不被阻塞,那么就要解锁,如下:

写锁:独占锁,排它锁。其他用户不能读,不能写 会对其他用户进行阻塞,只有阻塞解除了,其他用户才能读 (阻塞的)

实例:

对表进行写锁

对表进行解锁便能查询

  锁粒度:
    表锁:table lock
    锁定了整张表
  行锁:row lock
    锁定了需要的行

    粒度越小,开销越大,但并发性越好:
    粒度越大,开销越小,但并非性越差;

  锁的实现位置:
    MySQL锁:可以手动使用,可以使用显示锁
    存储引擎锁:自动进行的(隐式锁),

0x02

  InnoDB存储引擎也支持另外一种显示锁(锁定挑选出的部分行,行级锁)
    select .... lock in share mode
    select .... for update

实例:

  首先这种行级锁是适用于innodb存储引擎

  若不是innodb存储引擎,则需要更改,当然,大的实际的生产环境数据很庞大的环境,是不建议更改随便更改存储引擎,我这是测试,所有更改为innodb存储引擎

alter table classes engine 'innodb';

如下所示已经更改为innodb存储引擎

show table status like 'classes'\G;

设置行级锁模式

select * from classes where classid <= 5 lock in share mode;

PS:在以上行级锁,只能在sql语句执行的时候实现锁的机制,sql语句执行完毕,便不再起作用,所有这里无法演示其效果

0x03

事务:Transaction
  事务就是一组原子性的查询语句,也即将多个查询当作一个独立的工作单元。 

    理解事务:就是将一系列的sql语句当作“一句”来执行的一种机制——该系列语句要么全部执行成功,要么一个都不执行。

    事务实际应用:我们经验中的一个“操作”,其实常常对应着数据库(表)的2个或2个以上的操作,此时就应该让此2个操作具有“整体性”。比如网银汇款,其实是将一个储户中的钱减少一个数目,再将另一个储户的钱增加一个数目。如果只做完了前者,后者因为某种原因没有做完就出错了,此时就悲剧了。

  ACID测试:能够满足ACID测试就表示其支持事务,或兼容事务
    A:Atomicity,原子性,一个事务必须被分为不可分割的单元,要么都执行要么都不执行都执行
    C:Consistency,一致性,从一个一致性状态转到另外一个一致性状态,而不会导致数据丢失
    I:Isolaction,隔离性。一个事务的所有修改操作在提交前对其他事务时不可见的
    D: Durability, 持久性,一旦事务得到提交,其所做的修改会永久有效

启动事务
  start transaction;

事务提交
  commit

实例:

开启事务,删除数据。

上述删除数据,但是没有提交,commit,可以通过回滚,进行恢复,如下:

事务回滚
  rollback

如若按照上述进行删除数据,但是进行提交,commit,那么数据就真的被删除了,不能再回滚

SAVEPOINT 控制回滚的位置
  SAVEPOINT identifier
  ROLLBACK [WORK] TO [SAVEPOINT] identifier

实例:

再设置一个回滚点,如下:

尝试回滚对应回滚的位置:

0x04

如何没有显式启动事务,每个语句都会当作一个默认的事务,其执行完成会被自动提交  ---mysql的默认功能

show global variables like '%commit%';      ------ 为 ‘ON’ 表示自动提交

select @@global.autocommit          ---- 为 数字 ‘1’ 表示自动提交

关闭其自动提交功能   --- 设置为 ‘0’  --如下
set global autocommit = 0

注意 关闭自动提交,请记得手动启动事务,应记得手动提交

安全性越高,并发性越低

隔离级别:
  READ UNCOMMITTEND(读未提交),不可重复读,幻读  ---- 脏读 -> 能够读取别人尚未提交的数据叫脏读 -- 用户没有提交数据,但是别的用户能查询看到数据-读未提交
  READ COMMITTEND(读提交)  用户没有提交数据,查询看不到数据--- 读提交
  REPEATABLE READ (可重读)   ---mysql默认的隔离级别
  SERIALIZABLE(可串行化)强制事务的串行执行避免了幻读;性能极低

所有事务只支持innodb存储引擎

查看mysql的事务隔离级别
  show global variables like '%iso%'
  select @@global.tx_isolation

实例:

更改事务隔离级别为读未提交:

set global tx_isolation='read-uncommitted';

上述设置完成之后,因为是全局环境,所有要重新登录mysql进行测试,

回滚之后,发现查询脏读的数据,是一样的,此时验证了不可重复读。

实例:

更改事务隔离级别为读提交:

set global tx_isolation='read-committed';

开启事务,进行删除数据测试

此时在没有提交的情况下,在另一个会话中开启事务

start transaction;

进行查询,如下:

此时在提交的情况下,在另一个会话中查看数据,如下:

上述没有脏读。

实例:

更改事务隔离级别为REPEATABLE READ (可重读):

set global tx_isolation='repeatable-read';

开启事务,进行删除数据测试

此时在没有提交的情况下,在另一个会话中开启事务

start transaction;

进行查询,如下:

发现没有读到被删除后的数据,没有脏读。

当提交之后,发现还是看不到被删除的数据

上述是进行删除操作的用户,做了commit操作,她自己能够查看删除后的数据,但是其他用户并没有看到被删除后的数据,此时,其他用户需要自己commit才能查看被删除的数据,如下:

这就是REPEATABLE READ     可重读性

实例:

更改事务隔离级别为SERIALIZABLE(可串行化)强制事务的串行执行避免了幻读;性能极低

set global tx_isolation='serializable';

分别开启两个会话重新登录mysql开启事务,其中一个用户做删除操作,发现无法操作,一直卡着。

但是,如果两个用户都删除操作,会有其中一个用户操作成功,如下:

SERIALIZABLE(可串行化)强制事务的串行执行避免了幻读;性能极低

建议:对事物要求不特别严格的场景下,可以使用读提交

MVCC:多版本并发控制
每个事务启动时,InnoDB会为每个启动的事务提供一个当下时刻的快照
为实现此功能,InnoDB会为每个表提供两隐藏的字段,一个用于保存行的创建时间,一个用于保存行的失效时间
里面存储的系统版本号

旨在两个隔离级别下有效:read committed和repeatable read

mysql基础之-mysql锁和事务(七)的更多相关文章

  1. (3.12)mysql基础深入——mysql日志文件/其他文件(socket/pid/表结构/Innodb)

    (3.12)mysql基础深入——mysql日志文件/其他文件(socket/pid/表结构/Innodb) 关键词:mysql日志文件,mysqldumpslow分析工具 目录:日志文件的分类 1. ...

  2. (3.16)mysql基础深入——mysql字符集

    (3.16)mysql基础深入——mysql字符集 关键字:mysql字符集,mysql编码 目录 1.概念 2.常用的字符编码 3.查看mysql字符集 [3.1]查看服务器支持的字符集 [3.2] ...

  3. (3.15)mysql基础深入——mysql默认数据库/系统数据库

    (3.15)mysql基础深入——mysql默认数据库 关键词:Mysql默认数据库,mysql系统数据库 系统数据库的组成 一共4个 [1]information_schema(可以理解成字典表) ...

  4. (3.14)mysql基础深入——mysql 日志分析工具之pt-querty-digest【待完善】

    (3.14)mysql基础深入——mysql 日志分析工具之pt-querty-digest 关键字:Mysql日志分析工具.mysqlsla 常用工具 [1]mysqldumpslow:官方提供的慢 ...

  5. (3.13)mysql基础深入——mysql日志分析工具之mysqlsla【待完善】

    (3.13)mysql基础深入——mysql 日志分析工具之mysqlsla 关键字:Mysql日志分析工具.mysqlsla 常用工具 [1]mysqldumpslow:官方提供的慢查询日志分析工具 ...

  6. (3.11)mysql基础深入——mysql文件分类与配置文件管理

    (3.11)mysql基础深入——mysql文件分类与管理 关键词:mysql配置文件,mysql参数文件,mysql中的my.cnf 目录:mysql数据库文件分类: [1]参数文件:my.cnf ...

  7. (3.4)mysql基础深入——mysql.server启动脚本源码阅读与分析

    (3.4)mysql基础深入——mysql.server启动脚本源码阅读与分析 my.server主要分为3大部分 [1]变量初始化部分 [2]函数声明部分 [3]具体执行部分 #!/bin/sh # ...

  8. (3.2)mysql基础深入——mysql源码阅读工具安装与应用

    (3.2)mysql基础深入——mysql源码阅读工具安装与应用 关键字:mysql源码阅读工具 工具列举:一般多用[1][2][3]吧 [1]source insight [2]写字板/记事本 UE ...

  9. (3.1)mysql基础深入——mysql二进制与源码目录结构介绍

    (3.1)mysql基础深入——mysql二进制与源码目录结构介绍 关键字:二进制目录结构,源码目录结构(编译安装目录结构) 1.二进制安装程序目录结构 [1] BIN -- mysql的可执行文件( ...

  10. MySQL基础、MySQL安装和MariaDB安装

    MySQL基础 目录 MySQL基础 关系型数据库介绍 数据结构模型 RDBMS专业名词 关系型数据库的常见组件 SQL语句 MySQL安装与配置 MySQL安装 MariaDB安装 关系型数据库介绍 ...

随机推荐

  1. 3、get请求(url详解)

    前言 上一篇介绍了Composer的功能,可以模拟get和post请求,get请求有些是不带参数的,这种比较容易,直接放到url地址栏就行.有些get请求会带有参数,本篇详细介绍url地址格式. 一. ...

  2. 1、Fiddler基础

    1.抓取https请求 前言 fiddler是一个很好的抓包工具,默认是抓http请求的,对于pc上的https请求,会提示网页不安全,这时候需要在浏览器上安装证书. 一.网页不安全 1.用fiddl ...

  3. Vue中如何监听组件的原生事件

    在首页开发中,右下角有一个返回顶部的小箭头,将它单独封装成一个BackTop组件,但是它何时出现需要依赖于首页的滑动,即另外一个Scroll组件.如果直接在BackTop组件里面监听,则需要通过thi ...

  4. css 箭头三角形

    1.向下的三角形 .down{ display:inline-block; width:0px; height:0px; border-top:8px solid rgba(0, 0, 0, 0.65 ...

  5. live2d web端加载moc3模型

    大佬博客链接:https://blog.csdn.net/weixin_44128558/article/details/104792345 照着大佬的博客做一下,可以先学会怎么生成bundle.js ...

  6. 情人节闷在家里做画( 安卓统计图MPAndroidChart开发 )

    有些时候觉得一个人挺好的,可以更自由安排自己的时间: 有些时候觉得有个人挺好的,很多事情一个人做起来太没意思了,纵使心中澎湃,倾听的独有自己. 废话少说,直接上图 MPAndroidChart是啥 一 ...

  7. 使用php+mysql+xml完成一个调查问卷

    本人根据php典型模块与项目实战大全此书所完成的一个调查问卷,同时管理员可以进行修改调查内容 同时用到了一个css文件,借鉴于 http://www.wufangbo.com/div-css-vote ...

  8. Netty框架问题记录1--多线程下批量发送消息导致消息被覆盖

    业务背景 项目是基于Netty实现的实时课堂项目,课堂中老师需要对试卷进行讲解,则老师向服务器发送一个打开试卷信息的请求,服务器获取试卷信息,将试卷信息发送给所有的客户端(学生和老师). 发送给学生的 ...

  9. 多线程(thread+queue 售票)

    一.理解 如果线程里每从队列里取一次,但没有执行task_done(),则join无法判断队列到底有没有结束,在最后执行个join()是等不到结果的,会一直挂起.可以理解为,每task_done一次 ...

  10. mac+mamp安装composer

    打开终端 php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"   安 ...