MySQL innodb行锁测试

MySQL InnoDB 行锁实测
本文通过具体实验展示了MySQL InnoDB存储引擎的行锁机制。实验包括多个会话并发更新同一行数据的情况,详细记录了行锁的等待与解除过程,并提供了查看行锁状态的方法。
MySQL innodb行锁测试

MySQL innodb存储引擎使用与oracle相同的行锁机制,对如何查看系统中存在的行锁情况在下面的实验中,将可以看到。下面是测试过程:
<smallfont>PHP code:</smallfont>

session1
:更新记录



mysql
>setautocommit=off;

QueryOK,0rowsaffected(0.01sec)



mysql>updatet1setemail='test@test.com'whereid=0;

QueryOK,4rowsaffected(0.00sec)

Rowsmatched:4Changed:4Warnings:0





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



mysql
>setautocommit=off;

QueryOK,0rowsaffected(0.00sec)



mysql>updatet1setemail='abc'whereid=0;





session3:查看系统等待事件:

mysql>showstatuslike'%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|

+-------------------------------+---------+

14rowsinset(0.01sec)



session1:提交记录



mysql
>commit;

QueryOK,0rowsaffected(0.01sec)





session2:update立刻完成



mysql
>updatet1setemail='abc'whereid=0;

QueryOK,4rowsaffected(2min43.44sec)

Rowsmatched:4Changed:4Warnings:0





session3
:再次查看系统等待事件



mysql
>showstatuslike'%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|

+-------------------------------+---------+

14rowsinset(0.01sec)





查询会话session1,session2的连接ID



session1
:

mysql>status;

--------------

mysqlVer12.22Distrib4.0.24,forpc-solaris2.10(i386)



Connectionid:15



session2
:

mysql>status;

--------------

mysqlVer12.22Distrib4.0.24,forpc-solaris2.10(i386)



Connectionid:13





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



mysql
>showinnodbstatusG;

------------

TRANSACTIONS

------------

Trxidcounter03852351

Purgedone
fortrx'sn<imgsrc="images/smilies/33.gif"smilieid="204"border="0"alt=""/><03852350undon<imgsrc="images/smilies/33.gif"smilieid="204"border="0"alt=""/><00

Historylistlength11

Totalnumberoflockstructsinrowlockhashtable7

LISTOFTRANSACTIONSFOREACHSESSION:

---TRANSACTION00,notstarted,OSthreadid15

MySQLthreadid18,queryid2071119localhostroot

showinnodbstatus

---TRANSACTION03852350,ACTIVE6sec,OSthreadid14startingindexread

mysqltablesinuse1,locked1

LOCKWAIT2lockstruct(s),heapsize320

MySQLthreadid13,queryid2071118localhosttestUpdating--这里可以看到等待者

updatet1setemail='
abcwhereid=0--这里可以看到等待者正在执行的SQL

-------TRXHASBEENWAITING6SECFORTHISLOCKTOBEGRANTED:

RECORDLOCKSspaceid0pageno32782nbits1056index`idx_t1_id`oftable`dc_test/t1`trxid03852350lock_modeXwaiting

Recordlock
,heapno2PHYSICALRECORD:n_fields2;compactformat;infobits0

0
:len4;hex80000000;asc;;1:len6;hex00000196fe5d;asc];;



------------------

---
TRANSACTION03852348,ACTIVE391sec,OSthreadid12

7lockstruct
(s),heapsize1024,undologentries4

MySQLthreadid15
,queryid2071117loc
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值