TRANSACTIONS - xiaoboluo768/qianjinliangfang GitHub Wiki

  • 第六段信息
    • 下面这部分包含了一些关于innodb事务的总结信息,紧随其后的是当前活跃事务列表(如果在这里看到了锁等待信息,则表明您的应用程序可能发生锁了争用。这些锁等待输出信息可以帮助你跟踪事务死锁的原因)。如:
------------
TRANSACTIONS
------------
Trx id counter 4E0132AD
Purge done for trx's n:o < 4E01090B undo n:o < 0
History list length 1853

LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 4E0131D3, not started
MySQL thread id 26208218, OS thread handle 0x7fec7c582700, query id 5274800318 10.207.162.69 gdsser
---TRANSACTION 4E01323F, not started
MySQL thread id 26208217, OS thread handle 0x7fec7c1b3700, query id 5274800938 10.207.162.69 gdsser

....................

---TRANSACTION 4E0132AC, ACTIVE 0 sec preparing
2 lock struct(s), heap size 376, 1 row lock(s), undo log entries 1
MySQL thread id 26208200, OS thread handle 0x7fec567e0700, query id 5274801557 10.207.162.69 gdsser
commit
---TRANSACTION 4E0110E7, ACTIVE 188 sec
mysql tables in use 1, locked 0
MySQL thread id 26208154, OS thread handle 0x7fec7c235700, query id 5274800671 10.143.90.228 root Sending data
SELECT /*!40001 SQL_NO_CACHE */ * FROM `m_flowskillpoint`
Trx read view will not see trx with id >= 4E0110E8, sees < 4E0108EE
---TRANSACTION 4E0108EF, ACTIVE 233 sec fetching rows
mysql tables in use 1, locked 0
MySQL thread id 26208131, OS thread handle 0x7fec578e3700, query id 5274801341 10.143.90.228 root Sending data
SELECT /*!40001 SQL_NO_CACHE */ * FROM `m_flowsilver`
Trx read view will not see trx with id >= 4E0108F0, sees < 4E0108EC
---TRANSACTION 4E0108EE, ACTIVE 233 sec fetching rows
mysql tables in use 1, locked 0
MySQL thread id 26208132, OS thread handle 0x7fec7c78a700, query id 5274797797 10.143.90.228 root Sending data
SELECT /*!40001 SQL_NO_CACHE */ * FROM `m_flowmail`
Trx read view will not see trx with id >= 4E0108EF, sees < 4E0108EC
  • 这部分内容比较多,下面分段逐一进行解释:
# 这行表示当前事务ID,这是一个系统变量,每创建一个新事务都会增加
Trx id counter 4E0132AD 

# 这是innodb清除旧MVCC行时所用的事务ID,将这个值和当前事务ID进行比较,\
就可以知道有多少老版本的数据未被清除。这个数字多大才可以安全的取值没有硬性和速成的规定,如果数据没做过任何更新,\
那么一个巨大的数字也不意味着有未清除的数据,因为实际上所有事务在数据库里查看的都是同一个版本的数据(此时只是事务ID在增加,\
而数据没有变更),另一方面,如果有很多行被更新,那每一行就会有一个或多个版本留在内存里,减少此类开销的最好办法就是确保事务\
已完成就立即提交,不要让它长时间地处于打开状态,因为一个打开的事务即使不做任何操作,也会影响到innodb清理旧版本的行数据。\
 undo n:o < 0这个是innodb清理进程正在使用的撤销日志编号,为0 0时说明清理进程处于空闲状态。
Purge done for trx's n:o < 4E01090B undo n:o < 0 

# 历史记录的长度,即位于innodb数据文件的撤销空间里的页面的数目,如果事务执行了更新并提交,\
这个数字就会增加,而当清理进程移除旧版本数据时,它就会减少,清理进程也会更新Purge done for.....这行中的数值。
History list length 1853 

# 头部信息之后就是一个事务列表,当前版本的mysql还不支持嵌套事务,因此,在某个时间点上,每个客户端连接能够拥有的事务数量是\
有一个上限的,而且每一个事务只能属于单一连接(即一个事务只能使用单个线程执行,不能使用多个线程)。在输出信息里,每一个事务至\
少占有两行内容,如:
# 每个事务的第一行以事务的ID和状态开始,not started表示这个事务已经提交并且没有再发起影响事务的语句,可能刚好空闲
---TRANSACTION 4E0131D3, not started  

# 然后每个事务的第二行是一些线程等信息,MySQL thread id <数字>部分和是hi用show full processlist;命令看到的id列相同。\
紧随其后的是一个内部查询id和一些连接信息,这些信息同样与show full processlist中的输出相同。
MySQL thread id 26208218, OS thread handle 0x7fec7c582700, query id 5274800318 10.207.162.69 gdsser 

---TRANSACTION 4E01323F, not started
MySQL thread id 26208217, OS thread handle 0x7fec7c1b3700, query id 5274800938 10.207.162.69 gdsser

# 上面是not started状态的事务信息,下面来看看为ACTIVE状态的事务信息:
# 这行显示次事务处于活跃状态已经188s,可能的所有状态有not started,active,prepared\
和committed in memory,一旦事务日志落盘了就会变成not started状态。在时间后面会显示出当前事务正在做什么(在这里为空没有显示出来),\
在源代码中有超过30个字符串常量可以显示在时间后面,如:fetching,preparing,rows,adding foreign keys等等
---TRANSACTION 4E0110E7, ACTIVE 188 sec 
 
# 该事务用到的表数和涉及表锁的表数,Innodb一般不会锁定表,但对有些语句会锁定,如果mysql服务器\
在高于innodb层之上将表锁定,这里也是能够显示出来的,如果事务已经锁定了几行数据,这里将会有一行信息显示出锁定结构的数目\
(注意,这跟行锁是两回事)和和堆大小,如:2 lock struct(s), heap size 376, 1 row lock(s), undo log entries 1,\
堆的大小指的是为了持有这些行锁而占用的内存大小,Innodb是用一种特殊的位图表来实现行锁的,从理论上讲,\
它可将每一个锁定的行表示为一个比特,经测试显示,每个锁通常不超过4比特。
mysql tables in use 1, locked 0 

# 与show processlist输出结果大部分相同
MySQL thread id 26208154, OS thread handle 0x7fec7c235700, query id 5274800671 10.143.90.228 root Sending data
# 如果事务正在运行一个查询,那么这里就会显示事务涉及的SQL,注意:有些版本可能只显示其中一小段,而不是完整的SQL
SELECT /*!40001 SQL_NO_CACHE */ * FROM `m_flowskillpoint` 

# 这行显示了事务的读视图,它表明了因为版本关系而产生的对于事务可见和不可见两种类型的事务ID的范围,在这里,\
两个数字之间有一个事务的间隙,这个间隙里的事务可能是不可见的,innodb在执行查询时,对于那些事务ID正好在这个间隙的行,还会检查其可见性。
Trx read view will not see trx with id >= 4E0110E8, sees < 4E0108EE 

# 注:如果事务正在等待一个锁,那么在查询SQL文本后面将可以看到这个锁的信息,在上文的死锁例子里,这样的信息看到过很多了,不幸的是,\
输出信息并没有说出这个锁正被其他哪个事务持有,不过可以通过information_schema库下的innodb_trx,innodb_lock_waits,innodb_locks\
三个表来查明这一点。如果输出信息里有很多个事务,innodb可能会限制要打印出来的事务数目,以免输出信息增长得太大,这时就会看到...truncated...提示。

上一篇:LATEST DETECTED DEADLOCK | 下一篇:FILE I/O