`
brilon
  • 浏览: 21971 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Mysql innodb行锁测试

阅读更多
作者:丹臣 | 【转载时请务必以超链接形式标明文章原始出处和作者信息及本声明】
地址:http://rdc.taobao.com/blog/dba/html/110_innodb_row_lock_current_waits.html
MySQL innodb存储引擎使用与oracle相同的行锁机制,对如何查看系统中存在的行锁情况在下面的实验中,将可以看到。下面是测试过程:
session 1:更新记录

mysql> set autocommit=off;
Query OK, 0 rows affected (0.01 sec)

mysql> update t1 set email='test@test.com' where id=0;
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4 Changed: 4 Warnings: 0

session 2也更新相同的记录,出现等待

mysql> set autocommit=off;
Query OK, 0 rows affected (0.00 sec)

mysql> update t1 set email='abc' where id=0;
session 3:查看系统等待事件:

mysql> show status like '%lock%';
+-------------------------------+---------+
| Variable_name | Value |
+-------------------------------+---------+
| Com_lock_tables | 0 |
| Com_unlock_tables | 0 |
| Innodb_row_lock_current_waits | 1 | --这里
| Innodb_row_lock_time | 0 |
| Innodb_row_lock_time_avg | 0 |
| Innodb_row_lock_time_max | 0 |
| Innodb_row_lock_waits | 1 |
| Key_blocks_not_flushed | 0 |
| Key_blocks_unused | 14497 |
| Key_blocks_used | 0 |
| Qcache_free_blocks | 1 |
| Qcache_total_blocks | 1 |
| Table_locks_immediate | 2070991 |
| Table_locks_waited | 2 |
+-------------------------------+---------+
14 rows in set (0.01 sec)
session 1:提交记录

mysql> commit;
Query OK, 0 rows affected (0.01 sec)
session 2:update立刻完成

mysql> update t1 set email='abc' where id=0;
Query OK, 4 rows affected (2 min 43.44 sec)
Rows matched: 4 Changed: 4 Warnings: 0
session 3:再次查看系统等待事件

mysql> show status like '%lock%';
+-------------------------------+---------+
| Variable_name | Value |
+-------------------------------+---------+
| Com_lock_tables | 0 |
| Com_unlock_tables | 0 |
| Innodb_row_lock_current_waits | 0 | --这里为0
| Innodb_row_lock_time | 163436 |
| Innodb_row_lock_time_avg | 163436 |
| Innodb_row_lock_time_max | 163436 |
| Innodb_row_lock_waits | 1 |
| Key_blocks_not_flushed | 0 |
| Key_blocks_unused | 14497 |
| Key_blocks_used | 0 |
| Qcache_free_blocks | 1 |
| Qcache_total_blocks | 1 |
| Table_locks_immediate | 2070991 |
| Table_locks_waited | 2 |
+-------------------------------+---------+
14 rows in set (0.01 sec)
查询会话session 1,session 2的连接ID

session 1:
mysql> status;
--------------
mysql Ver 12.22 Distrib 4.0.24, for pc-solaris2.10 (i386)

Connection id: 15

session 2:
mysql> status;
--------------
mysql Ver 12.22 Distrib 4.0.24, for pc-solaris2.10 (i386)

Connection id: 13
在上面的session 1尚没有提交的时候,可以执行下列命令,查看一些事务阻塞信息

mysql> show innodb status\G;
------------
TRANSACTIONS
------------
Trx id counter 0 3852351
Purge done for trx's n:o < 0 3852350 undo n:o < 0 0
History list length 11
Total number of lock structs in row lock hash table 7
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0 0, not started, OS thread id 15
MySQL thread id 18, query id 2071119 localhost root
show innodb status
---TRANSACTION 0 3852350, ACTIVE 6 sec, OS thread id 14 starting index read
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 320
MySQL thread id 13, query id 2071118 localhost test Updating --这里可以看到等待者
update t1 set email='abc' where id=0 --这里可以看到等待者正在执行的SQL
------- TRX HAS BEEN WAITING 6 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 32782 n bits 1056 index `idx_t1_id` of table `dc_test/t1` trx id 0 3852350 lock_mode X waiting
Record lock, heap no 2 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
0: len 4; hex 80000000; asc ;; 1: len 6; hex 00000196fe5d; asc ];;

------------------
---TRANSACTION 0 3852348, ACTIVE 391 sec, OS thread id 12
7 lock struct(s), heap size 1024, undo log entries 4
MySQL thread id 15, query id 2071117 localhost test
当出现行锁时,谁等待谁?在哪里得到此信息,由于mysql采用的是线程机制,如何kill阻塞者,不知道在Mysql数据库里怎么操作?

--EOF--

分享到:
评论

相关推荐

    MySQL存储引擎之争-InnoDB与MyISAM全面对决

    InnoDB的行锁通过FOR UPDATE关键字实现并发读写;MyISAM的压缩表创建通过ROW_FORMAT=COMPRESSED指定。 综合来看,尽管InnoDB在事务和并发控制方面表现更优,已成为MySQL的默认存储引擎,但MyISAM在读密集型应用和...

    2013年中国数据库大会-28-秒杀场景下MySQL的低效--原因和改进

    5. InnoDB行锁机制分析:通过测试发现,在多线程环境下,MySQL的InnoDB存储引擎在处理更新同一行数据的并发时,TPS随线程数增加而下降。在并发线程数量达到一定程度时,性能下降明显,TPS值不可接受。 6. 并发控制...

    MySQL-5.1.18-src

    2. 存储引擎机制:MySQL支持多种存储引擎,如InnoDB(提供事务处理和行级锁定)、MyISAM(快速读取但不支持事务)等。源代码中可以查看这些引擎的实现细节。 3. 并发控制和事务处理:深入理解MVCC(多版本并发控制...

    「MySQL」经典面试题.docx

    18. **InnoDB行锁实现**: - 行锁是通过在索引记录上加锁实现的,以提高并发性能。 19. **恢复单个库或表**: - 使用`mysql -u username -p -h hostname 恢复全库,然后删除不需要的表。 - 使用`mysqlimport`或`...

    MySQL锁类型以及子查询锁表问题、解锁1

    当在查询条件中明确指定了主键,并且查询能够匹配到具体行时,InnoDB会实施行锁。例如: ```sql SELECT * FROM products WHERE id='3' FOR UPDATE; ``` 如果查询条件未指定主键或者无法唯一确定一行,如使用`&lt;&gt;`或...

    MySQL管理之道 性能调优、高可用与监控.part2.rar

    《mysql管理之道:性能调优、高可用与监控》由资深mysql专家撰写,以最新的mysql版本为基础,以构建高性能mysql服务器为核心,从故障诊断、表设计、sql优化、性能参数调优、mydumper逻辑、xtrabackup热备份与恢复、...

    Mysql优化笔记包括网盘视频教程

    MySQL优化是数据库管理中的关键环节,它涉及到提升查询性能、减少资源消耗以及改善整体系统效率。...在学习过程中,不仅需要理论知识,还需要动手实践,结合实际场景进行测试和调整,才能真正掌握MySQL优化的精髓。

    MySQL高级 锁机制

    在InnoDB存储引擎中,行锁主要依赖于索引来实现,这意味着如果没有有效的索引,行锁可能会升级为表锁。此外,还存在一种特殊类型的行锁——间隙锁(Gap Lock),它不仅锁定特定的行,还锁定行之间的间隙,防止其他...

    MySQL高级_思维导图

    MySQL通过InnoDB存储引擎检测并解决死锁。 - **事务隔离级别**:读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)、串行化(SERIALIZABLE),不同的隔离级别影响并发性能和...

    笔记-MySQL.pdf

    7. **MySQL中的锁**:MySQL中的锁机制包括表锁、行锁、页锁等,了解锁的类型、使用场景和冲突解决策略,可以减少并发操作中的数据竞争。 8. **版本差异**:虽然课程以MySQL 5.7.32为例,但大部分内容同样适用于...

    MySQL的面试题,以及对应的答案

    - **InnoDB** 和 **MyISAM** 是MySQL的两种主要存储引擎。InnoDB支持事务处理、行级锁定和外键约束,适合并发读写场景,提供更好的数据一致性。MyISAM则以更快的读取速度著称,但不支持事务和行锁,适用于读多写少...

    mysql死锁分析

    对于MySQL/InnoDB数据库而言,了解死锁的产生机制、分析死锁的方法以及如何预防死锁是非常重要的。 #### 一个不可思议的死锁 假设有一个表`dltask`,其结构如下: ```sql CREATE TABLE dltask ( id bigint ...

    Mysql8.0新特性与全局优化

    7. **innodb_lock_wait_timeout**: 设置行锁等待超时时间。根据具体业务场景调整该值有助于避免长时间的锁等待。 8. **innodb_flush_log_at_trx_commit**: 控制事务提交时日志刷新的方式。不同的值会对性能和安全性...

    2023最新版mysql安装包

    3. **改进的InnoDB存储引擎**:InnoDB作为MySQL的主要事务处理引擎,8.0版本对其进行了优化,包括更快的索引插入和更好的行锁定性能。 4. **通用表表达式 (Common Table Expressions, CTE)**:CTE允许在查询中创建...

    MySql高级.docx

    - **锁机制**:MySQL 提供了多种类型的锁机制,如行锁、表锁等,以确保并发访问时的数据一致性。 2. **数据库建模与优化** - **规范化**:通过对数据库表进行规范化设计,减少数据冗余,提高数据的一致性和完整性...

    Mysql 行级锁的使用及死锁的预防方案

    MySQL的InnoDB存储引擎支持事务处理,并且具备行级锁机制,这使得它在处理并发事务时具有较高的效率。行级锁分为共享锁(Read Lock)和排他锁(Write Lock),这两种锁的设计是为了实现并发读写操作。 共享锁,也...

    AliSQL数据库最佳实践之路.pdf

    库存热点优化的Version 1采用了InnoDB的严格并发控制,Version 2通过commit on success和select from update来减少锁竞争,而Version 3引入了行缓存、新的InnoDB行锁类型、组更新和关联事务等机制,进一步提升了并发...

    AliSQL数据库最佳实践之路.pptx

    Version 1采用InnoDB严格的并发控制,Version 2引入commit on success和select from update机制,Version 3则通过行缓存、新的InnoDB行锁类型、组更新和关联事务来进一步优化。 5. **未来发展规划** - AliSQL将...

Global site tag (gtag.js) - Google Analytics