mysql锁分析
mysql
車輪の唄
atarik@163.com
展开
-
MVCC(Multi-Version Concurrency Control) 多版本并发控制
MVCC的实现,是通过保存数据在某个时间点的快照来实现的.InnoDB的MVCC是通过在每行记录后面保存2个隐藏的列来实现的,一列保存了行的创建时间,一列保存了行的过期时间(或删除时间).但它们都存储的是系统版本号MVCC最大的作用是: 实现了非阻塞的读操作,写操作也只锁定了必要的行.MYSQL的MVCC 只在 read committed 和 repeatable read ...原创 2018-03-04 10:00:19 · 2306 阅读 · 0 评论 -
insert into死锁分析
不管事务管理级别如何设置,只要存在唯一性约束并且可能insert/delete/update同一key值的记录,死锁都将无法100%的避免,只能是概率降低唯一键冲突回滚造成的死锁, 不管是主键冲突,唯一键冲突,还是唯一联合索引冲突都会造成死锁, 但是加锁方式不同在插入之前,会先在插入记录所在的间隙加上一个插入意向gap锁成功插入后, insert会对插入成功的行加上排它锁关于意向g...原创 2018-05-24 17:38:29 · 3212 阅读 · 0 评论 -
在RR或RC隔离级别下的使用锁实现不可重复读
使用锁时是当前读(可以读取事务提交的数据), 不使用锁是快照读mysql> select * from item;+-----+------+----------+| id | name | order_id |+-----+------+----------+| 5 | | 5 || 6 | | 5 || 9 ...原创 2018-04-23 14:54:08 · 1378 阅读 · 0 评论 -
InnoDB的幻读(二)
MySQL InnoDB事务的隔离级别有四级,默认是“可重复读”(REPEATABLE READ)。未提交读(READ UNCOMMITTED)。另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据(脏读)。 提交读(READ COMMITTED)。本事务读取到的是最新的数据(其他事务提交后的)。问题是,在同一个事务里,前后两次相同的SELECT会读到不同的结果...原创 2018-04-23 13:12:03 · 193 阅读 · 0 评论 -
innodb幻读实例
mysql的默认事务级别是:可重复读其中可重复读是通过mvcc来实现的又叫快照读,在事务中的读操作通过对当前的数据库中记录一个版本,以后的读操作只会读取记录的版本,因此相当于对数据库的数据建立了一个快照数据,因此叫做快照读,其不用对数据库中的数据进行加锁又叫做乐观锁。同时RR事务级别的mysql通当前读和gap锁来解决幻读,其本质是通过对数据库周边记录进行加悲观锁(读锁(共享锁)和互斥锁(...原创 2018-04-23 13:02:19 · 601 阅读 · 2 评论 -
Innodb事务隔离级别及锁机制
MVCC:Snapshot Read vs Current ReadMySQL InnoDB存储引擎,实现的是基于多版本的并发控制协议——MVCC (Multi-Version Concurrency Control) (注:与MVCC相对的,是基于锁的并发控制,Lock-Based Concurrency Control)。MVCC最大的好处,相信也是耳熟能详:读不加锁,读写不冲突。在读多写...原创 2018-04-22 23:41:56 · 297 阅读 · 0 评论 -
mysql 事务未提交导致死锁 Lock wait timeout exceeded; try restarting transaction 解决办法
锁等待超时。是当前事务在等待其它事务释放锁资源造成的,默认参数:innodb_lock_wait_timeout设置锁等待的时间是50s,一旦数据库锁超过这个时间就会报错。解决方案第一种:1.查询是否锁表show OPEN TABLES where In_use > 0;2.查询进程(如果您有SUPER权限,您可以看到所有线程。否则,您只能看到您自己的线程)show ...原创 2018-03-23 12:06:58 · 2408 阅读 · 0 评论 -
死锁分析(二)
死锁日志:*** (1) TRANSACTION:TRANSACTION 367592, ACTIVE 2 sec starting index readmysql tables in use 1, locked 1LOCK WAIT 4 lock struct(s), heap size 1136, 2 row lock(s)MySQL thread id 70124, OS...原创 2018-08-20 17:09:00 · 466 阅读 · 0 评论 -
sql查询锁
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;MySQL中information_schema简略的介绍了Mysql中元数据信息库的各个表的作用,从这篇wiki中可以大致了解各个表的作用。这里主要介绍下Innodb事务锁相关的三个表:INNODB_TRX表、...原创 2018-08-22 11:24:46 · 1446 阅读 · 0 评论 -
生产环境下的一个死锁分析
首先是系统打印日志06:17:29.255 [http-nio-9055-exec-3] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Before request [uri=/childOrder/ModifiyChildOrderStatusDelivering]06:17:29.256 [http-nio-9055-exec-3] INFO ...原创 2019-03-12 15:52:16 · 1152 阅读 · 0 评论 -
mysql 持续非锁定读
持续读意味着InnoDB使用它的多版本化来给一个查询展示某个时间点处数据库的快照。查询看到在那个时间点之前被提交的那些确切事务做的更改,并且没有其后的事务或未提交事务做的改变。这个规则的例外是,查询看到发布该查询的事务本身所做的改变。如果你运行在默认的REPEATABLE READ隔离级别,则在同一事务内的所有持续读读取由该事务中第一个这样的读所确立的快照。你可以通过提交当前事务并在发布新...原创 2018-11-22 09:45:57 · 305 阅读 · 0 评论 -
产生死锁的两种原因
1. 两个事务获取相互兼容的锁, 再次获取排他锁时出现死锁2. 批量对数据加锁, 加锁过程是个持续性的. 案例见https://blog.csdn.net/asdfsadfasdfsa/article/details/83030011...原创 2018-10-14 13:54:47 · 1798 阅读 · 1 评论 -
mysql insert加锁分析及产生的死锁情况分析
不同的MySQL版本,不同的参数设置,都可能对加锁过程有影响。分析加锁机制还是应当尽可能多地列举一下关键参数,例如:当前mysql版本、事务隔离级别等。如下,仅仅只列出个别比较重要的参数。1.数据库版本 1 2 3 4 5 6 mysql> select version(); +-----------+...原创 2018-10-12 22:35:46 · 950 阅读 · 0 评论 -
insert into ... select 由于SELECT表引起的死锁情况分析
前提说法一:在RR隔离级别下 INSERT SELECT 会对 SELECT 表中符合条件的数据加上 LOCK_S 锁。说法二:(主键自增锁模式应该为0或1)情景一:insert into table1 ...select * from table2:table1锁表,table2逐步锁(扫描一个锁一个)情景二:insert into table1 ...select * from...原创 2018-10-12 17:09:27 · 19565 阅读 · 9 评论 -
RR和RC隔离级别下的锁总结
CREATE TABLE `person` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(100) DEFAULT NULL, `age` int(11) DEFAULT NULL, `test` bigint(20) DEFAULT NULL, `tests` bigint(20) DEFAULT NULL...原创 2018-08-23 09:40:03 · 4755 阅读 · 0 评论 -
delete 操作导致的锁定范围变化
1. 关于delete导致范围变化的解释2. 问题, 该实例主要是关于间隙锁的, why????事物二中的第二个select锁定范围是(-wuqiong,4], 是个gap lock, 锁定4的原因??...原创 2018-08-22 19:26:55 · 1222 阅读 · 4 评论 -
死锁分析(三)
死锁产生操作:事物一先获取id=3的s锁, 然后事物二准备获取id=3的x锁,事物一再次准备获取x锁死锁日志LATEST DETECTED DEADLOCK------------------------2018-08-21 12:44:19 0x7f7090133700*** (1) TRANSACTION:TRANSACTION 2343, ACTIVE 23 se...原创 2018-08-22 11:33:04 · 539 阅读 · 0 评论 -
innodb隐式锁和显示锁
innodb引擎中, 锁是根据也的组织形式来进行管理的. 若要知道页中某一条记录是否已经有锁,则通过位图的方式, 位图中的索引与记录的heap no一一对应. 行锁在innodb存储引擎中的定义如下struc lock_reck_struct{ ulint space; ulint page_no; ulint n_bits;}假设页中有250调记录,变量n_b...原创 2019-03-15 16:11:08 · 1563 阅读 · 0 评论