前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL InnoDB 锁和事务

MySQL InnoDB 锁和事务

作者头像
yingzi_code
发布2019-08-31 12:44:15
7860
发布2019-08-31 12:44:15
举报

标准行级锁:共享锁和排它锁 特殊的锁:意向锁

  • 一致性非锁定性读: 指InnoDB存储引擎通过行多版本控制的方式读取当前执行时间数据库中行的数据,如果读取的行正在执行delete或者update操作,这时读取操作不会去等待行锁的释放,相反的会去读取行的一个快照数据 在事务隔离级别READ COMMITTED和REPEATABLE READ(默认事务级别)下,InnoDB使用费一致性锁定性锁,但对于快照数据的定义却不一样,READ COMMITTED总是读取最新的一份快照数据,而REPEATABLE READ读取的是事务开始时的快照数据
  • 一致性锁定读: 在某些情况下,用户需要显示的对数据库读取操作进行加锁以保证数据逻辑的一致性,而这要求数据库支持加锁语句,innodb对于select语句支持两种一致性的锁定读操作: select … for update 对读取的行加一个X锁,其他事务不能对已锁定的行加任何锁 select … lock in share mode 对读取的行加一个S锁,其他事务可以向已锁定的行加S锁,但是加X锁会阻塞 对于一致性非锁定性读,即使读取的行已经加了X锁,也是可以被读取的。当事务提交了,锁就释放了。所以使用以上两种锁时,务必加上BEGIN ,START TRANSACTION 或 SET AUTOCOMMIT=0
  • 锁的三种算法: Record Lock:单个行记录上的锁 Gap Lock: 间隙锁,锁定一个范围,但不包含记录本身 Next-Key Lock:锁定一个范围,并锁定记录本身
  • 锁问题: 脏读:即一个事务读到了另一个事务未提交的数据,违反了数据库的隔离性 只有将事务开启为READ UNCOMMITTED才会发生 不可重复读:一个事务在多次读取同一个数据集合,由于事务没有结束,有另一个事务也访问了该数据集合,并进行了一些DML操作,因此第一个事务两次读取到的值不同,违反了数据的一致性 在InnoDB中默认事务隔离级别REPEATABLE READ通过Next-Key Lock算法来避免了不可重复读的问题 丢失更新:简单来说就是一个事务的更新操作被另一个数据的更新操作所覆盖 要避免更新操作的发生,需要让事务在这种情况下串行化,而不是并行化 阻塞:因为不同锁之间的兼容问题,某些时刻一个事务中的锁需要等待另一个事务释放它占用的资源 死锁:两个或两个以上的事务在执行过程中,因争夺锁资源而造成相互等待的现象 解决死锁的方法之一就是超时,当前数据库还普遍采用一种wait for graph的方式来检测死锁
事务

事务的四大特性ACID

A(Automicity)原子性,要么成功要么失败 C(consistency)一致性 I(isolation)隔离性 D(durability)持久性

事务隔离级别

事务隔离级别

脏读

不可重复读

幻读

读未提交(read-uncommitted)

不可重复读(read-committed)

可重复读(repeatable-read)

串行化(serializable)

参考:

  1. 高性能MySQL 第3版
  2. MySQL技术内幕-InnoDB存储引擎 第2版
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年09月24日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 事务
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档