2019独角兽企业重金招聘Python工程师标准>>>

一 两段锁协议

因为数据库中有大量的并发访问,为了预防死锁,一般推荐使用一次封锁法,就是在方法的开始阶段预先知道使用哪些数据,然后全部锁住,在方法运行之后在解锁。可以避免死锁。但是数据库并不知道要用到哪些数据。

数据库遵循两段锁协议,将事物分成两个阶段。加锁阶段和解锁阶段。

加锁阶段:该阶段可以进行加锁操作,在任何数据进行读之前,都要申请并获得S锁(共享锁)。在写操作之前要获得X锁。加锁不成功,则事物进入等待状态,直到加锁成功才继续执行。

事务加锁/解锁处理

begin; insert into test .....加insert对应的锁

update test set...加update对应的锁

delete from test ....加delete对应的锁

commit;

事务提交时,同时释放insert、update、delete对应的锁。

这种方式无法避免死锁,但是两段锁可以保证事物的并发调度是串行的。

二 事物的四种隔离级别

在RC 这个隔离级别,数据的读取都是不加锁的,但是数据的写入,修改,删除是需要加锁的。

事务A 事务B
begin; begin;
update class_teacher set class_name='初三二班' where teacher_id=1; update class_teacher set class_name='初三三班' where teacher_id=1;
  ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
commit;

teacher_id 加了索引,锁住的是teacher_id 这一行,如果没有索引,锁住是是整个表。但实际使用过程中,MySql做了一些改进,在MySQL  Server过滤条件发现不满足后,会调用unlock_row 方法把不满足条件的记录释放锁 (违背了二段锁协议的约束)。这样做,保证了最后只会持有满足条件记录上的锁,但是每条记录的加锁操作还是不能省略的。

RR 隔离级别

事务A 事务B 事务C
begin;

begin;

begin;

select id,class_name,teacher_id from class_teacher where teacher_id=1;

id class_name teacher_id
1 初三二班 1
2 初三一班 1
   
 

update class_teacher set class_name='初三三班' where id=1;

commit;

 
    insert into class_teacher values (null,'初三三班',1);commit;

select id,class_name,teacher_id from class_teacher where teacher_id=1;

id class_name teacher_id
1 初三二班 1
2 初三一班 1

很多人容易搞混不可重复读和幻读,确实这两者有些相似。但不可重复读重点在于update和delete,而幻读的重点在于insert。

在可重复读中,该SQL第一次读取到数据后就将这些数据加锁,其它事务无法修改这些数据,就可以实现可重复读了。但是无法锁住insert 数据。

三  MVCC协议

mySql 这种成熟的数据库出于性能考虑,使用了基于乐观锁的为理论基础的MVCC(协议)

在InnoDB中,会在每行数据后添加两个额外的隐藏的值来实现MVCC,这两个值一个记录这行数据何时被创建,另外一个记录这行数据何时过期

转载于:https://my.oschina.net/u/3218528/blog/1615649

Innodb 的事物隔离级别实现原理(一)相关推荐

  1. 数据库的四种事物隔离级别(基于MySQL的InnoDB存储引擎)

    准备工作 创建一个表,并插入几条基础数据 CREATE TABLE `transaction_isolation` (`id` bigint(10) NOT NULL AUTO_INCREMENT,` ...

  2. SHOW VARIABLES LIKE “tx_isolation“查看mysql查看当前数据库的事物隔离级别

    SHOW VARIABLES LIKE "tx_isolation"查看mysql查看当前数据库的事物隔离级别

  3. MySQL数据库事物隔离级别

    mysql数据库的事物隔离级别主要有四种: Serializable 串行化,一个事物一个事物的执行 Repeatable read 可重复读 , 无论其他事物是否修改并提交了数据,在这个事物中看到的 ...

  4. Mysql事物隔离级别

    事物隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommitted) 是 是 是 不可重复读(read-ccommitted) 否 是 是 可重复读 (repeatable-read) ...

  5. mysql 消极锁_MySQL支持的事物隔离级别以及消极锁和乐观锁原理和应用场景

    在一样平常开发中,尤其是营业开发,少不了行使 Java 对数据库举行基本的增删改查等数据操作,这也是Java工程师的必备手艺之一.做好数据操作,不仅仅需要对Java语言相关框架的掌握,更需要对种种数据 ...

  6. 事物的级别_面试官问:MySQL锁与事物隔离级别你知道吗?

    本文作者:何建辉(公众号:org_yijiaoqian) 点赞再看,养成习惯,微信搜一搜[一角钱小助手]关注更多原创技术文章. 本文 GitHub org_hejianhui/JavaStudy 已收 ...

  7. mysql的事物隔离级别

    我们对于InnoDB这个数据存储引擎,他最大的特点是支持了事务,还记得吗,事务除了具有ACID的四大特性以外,事务是不是还有个隔离级别,还记得是什么时候讲过,讲Spring的时候,Spring的事务控 ...

  8. Hibernate 事物隔离级别 深入探究

    目录 一.数据库事务的定义 二.数据库事务并发可能带来的问题 三.数据库事务隔离级别 四.使用Hibernate设置数据库隔离级别 五.使用悲观锁解决事务并发问题 六.使用乐观锁解决事务并发问题 Hi ...

  9. 面试官问:MySQL锁与事物隔离级别你知道吗?

    点赞再看,养成习惯,微信搜一搜[一角钱小助手]关注更多原创技术文章. 本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章. 前言 MySQL索引底层数据结构与算 ...

  10. mysql 事务隔离级别实现原理_MySQL事务隔离级别和实现原理 - 米扑博客

    开发中经常提到数据库的事务,那你知道数据库还有事务隔离的说法吗, 事务隔离还有隔离级别,那什么是事务隔离,隔离级别又是什么呢? MySQL 事务 本文所说的 MySQL 事务都是指在 InnoDB 引 ...

最新文章

  1. 阿里云文件存储和自我管理的云解决方案的TCO比较
  2. 开发操作系统的各种方法
  3. 使用命令启动IIS管理器
  4. aix服务重启mysql_mysqld进程几分钟重启一次,如何解决?
  5. JQuery中一些常用函数的运用
  6. 8屏 旌宇多屏管理软件_如何选择拼接屏,不能说的秘密,都在这!
  7. 【计算机网络复习 数据链路层】3.4.3 后退N帧协议(GBN)
  8. string 长度_String源码解析
  9. P1422 小玉家的电费--2022.03.15
  10. 大班科学计算机的发明应用教案,大班科学教案:机器人探密
  11. java oo 封装_javaOO——封装、static、成员内部类
  12. 通过Ftp put命令上传导致文件损坏的解决办法
  13. PHP经常用到的方法,[PHP]经常用到的实用函数集合第1/2页
  14. 目标检测数据集标注工具LabelImg从安装到使用详解
  15. 交通标志图——警告标志
  16. ubuntu14.04系统假死及强制关机后产生的问题解决
  17. 软件开发时,比较好的辅助软件推荐
  18. python列表lambda表达式排序sort(key=lambda x:x[1])
  19. 自我健康检测及产品应用方案
  20. 详解SMS2003部署Windows 2003

热门文章

  1. 深度学习分类pytorch_立即学习AI:02 —使用PyTorch进行分类问题简介
  2. acl自然语言处理_ACL 2020中自然语言处理中的知识图
  3. c语言程序设计怎么改卷,C语言程序设计(B卷)教程.doc
  4. 金蝶K3 WISE BOM多级展开_销售成本表
  5. Linux下的IPC机制
  6. 理解JavaScript内联命名函数---var fun = function f() {}
  7. spring aop advice
  8. Oracle Active database duplication
  9. Elite Model的NetSuite ERP国内成功实例!
  10. ubuntu phpmyadmin 404 not found