首页
学习
活动
专区
圈层
工具
发布

MySQL单表模拟锁和事务的几个场景

在MySQL中对于并发,锁问题总是会有很多值得讨论的地方,但是通常来说,要模拟这些锁或者一些锁的问题需要花点功夫,比如创建多个表,创建大量的数据,然后像调试钟表的秒针一样,让问题刚好复现在哪个时间点上...如果换一个角度,单表来模拟这类而是可以吗,其实是可行的。 今天简单通过单表的测试模拟死锁,事务中的隐式提交(其实可以理解是个bug),间歇锁。...初始化数据 首先的准备工作就是初始化数据,我们创建一个表test,事务隔离级别为默认的RR。...| +------+------+ 2 rows in set (0.00 sec) 间歇锁测试 上面的测试场景其实还是多多少少都有些关联,其中第一个场景和间歇锁也有关系,我就简单用单表模拟一下间歇锁...首先还是保证事务隔离级别是RR,因为间歇锁是RR隔离级别特供,RC中就没有间歇锁这样的定制,在并发场景中还是有不小的影响。我们来看看效果。

3.1K80
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MySQL InnoDB 锁和事务

    锁 标准行级锁:共享锁和排它锁 特殊的锁:意向锁 一致性非锁定性读: 指InnoDB存储引擎通过行多版本控制的方式读取当前执行时间数据库中行的数据,如果读取的行正在执行delete或者update...操作,这时读取操作不会去等待行锁的释放,相反的会去读取行的一个快照数据 在事务隔离级别READ COMMITTED和REPEATABLE READ(默认事务级别)下,InnoDB使用费一致性锁定性锁,...当事务提交了,锁就释放了。...,需要让事务在这种情况下串行化,而不是并行化 阻塞:因为不同锁之间的兼容问题,某些时刻一个事务中的锁需要等待另一个事务释放它占用的资源 死锁:两个或两个以上的事务在执行过程中,因争夺锁资源而造成相互等待的现象...read-committed) 否 是 是 可重复读(repeatable-read) 否 否 是 串行化(serializable) 否 否 否 参考: 高性能MySQL 第3版 MySQL技术内幕

    1.2K30

    MySQL 锁机制和事务

    当一个事务拥有一行的排他锁时,另外的事务在此行数据上无法获得共享锁和排它锁,只能等待第一个事务的锁释放 除了共享锁和排他锁之外, InnoDB也支持意图锁。...该锁类型是属于表级锁,表明事务在后期会对该表的行施加共享锁或者排它锁。...当一个InnoDB表没有任何索引时, 则行级锁会施加在隐含创建的聚簇索引上,所以说当一条sql没有走任何索引时,那么将会在每一条聚集索引后面加X(排它)锁,这个类似于表锁,但原理上和表锁应该是完全不同的...,update和delete操作都会在需要检查外键约束的行上施加共享行锁 Lock table语句是施加表级锁 幻读 幻读问题发生在同一个事务中当相同的读操作在前后两次读数据时返回不同的结果集。...,而导致相互一直无限等待  死锁可能发生在不同的事务都会对多个相同的表和相同的行上施加锁,但事务对表的操作顺序不相同 为了减少死锁的发生,要避免使用lock table语句,要尽量让修改数据的范围尽可能的小和快速

    1.3K10

    MySQL 全局锁、表锁和行锁

    // MySQL 全局锁、表锁和行锁 // 最近在极客时间看丁奇大佬的《MySQL45讲》,真心觉得讲的不错,把其中获得的一些MySQL方向的经验整理整理分享给大家,有兴趣同学可以购买相关课程进行学习...今天分享的内容是MySQL的全局锁、表锁和行锁。...我们知道MySQL自带的mysqldump逻辑备份工具可以使用--single-transaction参数来进行备份,因为Innodb存储引擎支持事务和MVCC的原理,所以该备份方法没有问题。...而 --single-transaction方法只适用于所有的表使用事务引擎的库; 2、表级锁 MySQL里面表级别的锁有两种,一种是表锁,一种是元数据锁(MDL) 表锁的加锁方式为lock tables...当前线程也不能对表t1做写的操作 MDL元数据锁是指在对一个表做增删改查的时候,MySQL会对该表加MDL读锁,防止另外一个线程对该表做变更操作,当对一个表做表结构变更的时候,会对该表加MDL写锁。

    6.3K20

    MYSQL的全局锁和表锁

    根据加锁的范围,MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类。今天这篇文章,我会和你分享全局锁和表级锁。而关于行锁的内容,我会留着在下一篇文章中再和你详细介绍。...当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。...表级锁MySQL里面表级别的锁有两种:一种是表锁,一种是元数据锁(meta data lock,MDL)。 表锁的语法是 lock tables … read/write。...事务中的MDL锁,在语句执行开始时申请,但是语句结束后并不会马上释放,而会等到整个事务提交后再释放。如何安全地给小表加字段?首先我们要解决长事务,事务不提交,就会一直占着MDL锁。...在MySQL的information_schema 库的 innodb_trx 表中,你可以查到当前执行中的事务。

    1K10

    事务、视图、锁表

    独立,他不应以任何方式依赖或影响其他事务 持久性(Durability) 事务完成后,他对数据库的修改已被永久保持 3.如何创建事务 MySQL中支持事务的存储引擎有InnoDB和BDB 注意:begin...-- 事务开启 START TRANSACTION; 或者 BEGIN; 开启事务后,所有被执行的SQL语句均被认作当前事务内的SQL语句。 -- 事务提交 JDX制作17. 锁表 18....数据定义语言(DDL)语句不能被回滚,比如创建或取消数据库的语句,和创建、取消或更改表或存 储的子程序的语句。 2....一个视图可以嵌套另一个视图 对视图数据进行添加、更新和删除操作直接影响所引用表中的数据 当视图数据来自多个表时,不允许添加和删除数据,一个表时可以进行修改 5.查看所有视图 USE information_schema.../* 锁表 */ 表锁定只用于防止其它客户端进行不正当地读取和写入 MyISAM 支持表锁,InnoDB 支持行锁 -- 锁定 LOCK TABLES tbl_name [AS alias] -- 解锁

    1.2K20

    MySQL 表锁和行锁机制

    MySQL 表锁和行锁机制 行锁变表锁,是福还是坑?如果你不清楚MySQL加锁的原理,你会被它整的很惨!不知坑在何方?没事,我来给你们标记几个坑。遇到了可别乱踩。...InnoDB更适合高并发场景,同时也支持事务处理。我们通过下面这个案例(坑),来了解行锁和表锁。...可MySQL却认为大量对一张表使用行锁,会导致事务执行效率低,从而可能造成其他事务长时间锁等待和更多的锁冲突问题,性能严重下降。所以MySQL会将行锁升级为表锁,即实际上并没有使用索引。...表明MySQL实际上并没有使用索引,行锁升级为表锁也和上面的结论一致。...锁定机制的优劣直接影响到一个数据库的并发处理能力和性能。 到这里,Mysql的表锁和行锁机制就介绍完了,若你不清楚InnoDB的行锁会升级为表锁,那以后会吃大亏的。

    7.5K40

    mysql 事务和锁知多少

    前言 文章内容输出来源:拉勾教育Java高薪训练营; mysql 事务特性、隔离级别,事务控制等等,我都在拉勾训练营学到啦,面试的时候再也不怕啦。...事务隔离级别 MySQL数据库是通过事务隔离级别来解决的,数据库系统提供了以下 4 种事务隔离级别供用户选择。...锁分类 在 MySQL中锁有很多不同的分类 从操作的粒度可分为表级锁、行级锁和页级锁。...锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在InnoDB 存储引擎中。 页级锁:每次锁定相邻的一组记录,锁定粒度界于表锁和行锁之间,开销和加锁时间界于表锁和行锁之间,并发度一般。...行锁原理 在 InnoDB 引擎中,我们可以使用行锁和表锁,其中行锁又分为共享锁和排他锁。

    1.1K40

    MySQL事务隔离级别和锁

    数据库为了维护事务的几种性质,尤其是一致性和隔离性,一般使用加锁这种方式。同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力。...一致性(Consistency):指事务将数据库从一种状态转变为另一种一致的的状态,事务开始前和结束后,数据库的完整性约束没有被破坏。比如A向B转账,不可能A扣了钱,B却没收到。...(注:MySQL 通过锁机制来保证事务的隔离性)持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。...(注:MySQL 使用 redo log 来保证事务的持久性)事务的并发问题脏读:事务 A 读取了事务 B 更新的数据,然后 B 回滚操作,那么 A 读取到的数据是脏数据不可重复读:事务 A 多次读取同一数据...(Phantom Rows:幻影行)解决不可重复读的问题只需锁住满足条件的行(行锁),解决幻读需要锁表(表锁)

    50300

    mysql事务和锁的实践

    这样在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。 幻读 : 是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。...同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。...1; 复制代码 Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 B窗口更新数据会因为A窗口的锁提示失败...teacher_id 1 ddd 2 2 bbb 3 3 eee 4 4 fff 5 4 rows in set (0.00 sec) B窗口开启事务,修改和插入数据,提交。...,mysql内部其实已经解决了) GAP锁 A窗口事务未提交 mysql> update class_teacher set class_name = 'ass' where teacher_id =

    72020

    关于使用MySQL innoDB引擎中事务和锁的信息记录表

    innodb_trx,innodb_locks, innodb_lock_waits 通过这三张表用户可以更简单的去查看数据库中的锁问题。...1. information_schemma.INNODB_TRX 此表是查看当前运行的事务 表中对应的字段说明见下图 ?...2. information_schema.INNODB_LOCKS innodb_trx可以查看到事务大概运行情况但是不能查看他具体的锁详情,那么我们就可以通过他trx表中的等待事务锁id去locks...表查找当前被锁住的id 或者 根据事务来查看当前事务的锁的状态详情 ?...3.information_schema.INNODB_LOCKS_WAITS 这个表可以让用户清楚的看到那个事务阻塞了那个事务,但是这里只给出事务ID,没有更详细的锁信息,但是lock_waits这张表和

    2.8K20

    面试:mysql 事务和锁的解释

    对于mysql中注重事务优化的就是innodb引擎,我们学习一下innodb事务; 什么是事务? 事务就是一系列的操作,要满足ACID,要么全成功,要么全失败,只满足这还不够,需要ACID; 1....; 总结,主键索引和唯一索引,在等值查询时只锁查询出来的值,但是普通索引是采用间隙锁,没走索引的直接采用表锁; 当然:范围查询都是使用间隙锁; 6.意向锁 意向共享锁(IS):事务打算给数据行共享锁,事务在给一个数据行加共享锁前必须先取得该表的...意向排他锁(IX):事务打算给数据行加排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。...意向锁主要处理是这类问题,例如要在一个表上加X排他锁,需要判断表行上是否已经加了排他锁,所以需要依次遍历进行判断,显然表太大,效率会很慢; 所以innodb在设计时,在给表加上一个IX意向锁,如果某行加...X锁,就在IX表示,那么对表加X,只需要查看IX,防止遍历整个表; 所以意向锁之和表X,S冲突;

    69210

    MySQL表锁、行锁、排它锁和共享锁

    专栏持续更新中:MySQL详解 事务隔离级别的实现原理:简单来说就是各种锁机制和MVCC多版本并发控制 我们学习知识的时候,需要了解知识点出现的原因,什么情况下能用到这个知识 我们说到事务,就得说到事务的...InnoDB引擎下表的不同行,但如果使用相同的索引字段作为过滤条件,依然会发生锁冲突,只能串行进行,不能并发进行 即使SQL中使用了索引,但是经过MySQL的优化器后,如果认为全表扫描比使用索引效率高,...此时会放弃使用索引,因此也不会使用行锁,而是使用表锁,比如对一些很小的表,MySQL就不会去使用索引 三、排它锁(Exclusive)和共享锁(Shared) 排它锁,又称为X锁,写锁 共享锁,又称为...因为现在name走的是索引, 通过zhangsan在辅助索引树上找到它所在行记录的id是7,然后到主键索引树上,获取对应行记录的排他锁(MySQL Server会根据情况,在主键索引树和辅助索引树上加锁...表级锁还是行级锁说的是锁的粒度,共享锁和排他锁说的是锁的性质,不管是表锁还是行锁,都有共享锁和排他锁的区分

    1.5K41

    面试:mysql 事务和锁的解释

    对于mysql中注重事务优化的就是innodb引擎,我们学习一下innodb事务; 什么是事务? 事务就是一系列的操作,要满足ACID,要么全成功,要么全失败,只满足这还不够,需要ACID; 1....mysql 在select 会生成一个 ReadView 字段数组,里面保存着这条数据没有条件的事务版本号; 这时另一个事务读取版本链,如何在ReadView跳过,最终找到原本的数据; 如果一个事务commit...; 总结,主键索引和唯一索引,在等值查询时只锁查询出来的值,但是普通索引是采用间隙锁,没走索引的直接采用表锁; 当然:范围查询都是使用间隙锁; 6.意向锁 意向共享锁(IS):事务打算给数据行共享锁,事务在给一个数据行加共享锁前必须先取得该表的...意向排他锁(IX):事务打算给数据行加排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。...读写锁(MyISAM)表锁 一个表加读锁后,只能对当前表进行读,不能更新,更新默认加x锁,在锁期间也不能访问其他表,避免持有并请求; 其他访问加读锁的表,但是更新加读锁表会阻塞,需要加x锁; 一个表加写锁后

    87120

    MySQL 全局锁、表锁和行锁「建议收藏」

    今天分享的内容是MySQL的全局锁、表锁和行锁。...我们知道MySQL自带的mysqldump逻辑备份工具可以使用–single-transaction参数来进行备份,因为Innodb存储引擎支持事务和MVCC的原理,所以该备份方法没有问题。...而 –single-transaction方法只适用于所有的表使用事务引擎的库; 2、表级锁 MySQL里面表级别的锁有两种,一种是表锁,一种是元数据锁(MDL) 表锁的加锁方式为lock tables...当前线程也不能对表t1做写的操作 MDL元数据锁是指在对一个表做增删改查的时候,MySQL会对该表加MDL读锁,防止另外一个线程对该表做变更操作,当对一个表做表结构变更的时候,会对该表加MDL写锁。...MDL锁不需要显式使用,在访问一个表的时候会被自动加上 MDL锁可能会造成MySQL宕掉!!!

    2.9K20

    MySQL事务和锁——《MySQL DBA工作笔记》

    MySQL事务 事务存在的原因 事务存在的目的:保证用户对数据操作对数据是安全的。...MySQL锁机制 Innodb实现了两种类型的行锁:共享锁,排他锁。 共享锁和排他锁 共享锁:允许一个事务读一行,阻止其他事务获得相同数据集的排他锁,多个共享锁是可以并行的。...间隙锁的目的是为了防止幻读 innodb自动使用间隙锁的条件: 必须在RR级别下 检索条件必须有索引(没有索引的话,mysql会全表扫描,那样会锁定整张表所有的记录,包括不存在的记录,此时其他事务不能修改不能删除不能添加...【行锁和表锁】 MyISAM存储引擎使用的是表锁,而Innodb增加了行锁。并不意味着Innodb彻底抛弃了表锁。...在高并发场景下使用行锁而忍受一些问题本质上是一种权衡。 【意向锁的背景冲突】 意向锁的出现本质上是解决行锁和表锁矛盾的问题。

    1.3K30

    MySQL基础篇5 mysql的全局锁和表锁

    , 因为你还会碰到接下来我们要介绍的表级锁. mysql表级锁有两种: 一种是表锁, 一种是元数据锁....在mysql 5.5 中引入了MDL, 当对一个表做增伤爱差操作的时候, 加MDL 读锁; 当对一个表做结构变更擦欧总的时候, 加MDL写锁. 读锁之间不互斥, 可以有多个线程对一张表增删改查....首先我们要解决长事务, 事务不提交, 就会一直占着MDL锁, 在mysql 的information_schema 库的innodb_trx表中, 可以查到当前执行中的事务....我见过这样的情况,最后业务开发就是把 lock tables 和 unlock tables 改成 begin 和 commit,问题就解决 MDL 会直到事务提交才释放,在做表结构变更的时候,一定要小心不要导致锁住线上查询和更新...全局锁和表锁都是server层实现的 MDL是防止DDL和DML并发的冲突 补充: 上述例子. sessionC在被sessionA阻塞后, sessionC的DDL操作处理等待, 为什么sessionD

    2.8K50

    MySQL锁类型&事务

    锁类型 按照功能化分:读锁和写锁; 按照作用范围分:表级锁和行级锁;  功能 读锁:又称“共享锁”,是指多个事务可以共享一把锁,都只能访问数据,并不能修改。...写锁:又称“排他锁”,是不能和其他事务共享数据的,如果一个事务获取到了一个数据的排他锁,那么其他事务就不能再获取该行的其他锁,包括共享锁和排他锁。  ...表锁:是指会将整个表进行锁定,性能较差,不同存储引擎支持的锁的粒度不同,InnoDB引擎支持表级锁也支持行级锁,MyISAM引擎支持表级锁。...解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表 避免脏读:通过对数据加行锁或则表锁,使对同一数据进行操作的事务处于等待状态,来避免同时操作 避免不可重复读:通过MVVC实现事务的可重复读 避免幻读...MySQL在5.5版本之前默认的数据库引擎时MyISAM,虽然性能极佳,而且提供了大量的特性,包括全文索引、压缩、空间函数等,但MyISAM不支持事务和行级锁,而且最大的缺陷就是崩溃后无法安全恢复。

    1.3K11

    史上最详细MySQL全局锁和表锁

    墨墨导读:根据加锁的范围,MySQL里面的锁大致可以分成全局锁,表级锁,行锁。本文主要讲述MySQL全局锁和表锁。 1. 全局锁 ---- 全局锁就是对整个数据库实例加锁。...当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。...表级锁 ---- MySQL里面表级别的锁有两种:一种是表锁,一种是元数据锁(meta data lock,MDL)。...#查看系统当前时间 mysql> select now(); 事务开始时间和系统现在时间,一看事务执行了这么久。...在 MySQL 的information_schema 库的 innodb_trx 表中,你可以查到当前执行中的事务。

    3.5K20
    领券