我在用户登录时在Yii版本1.1.13中的MySql会话表中收到随机死锁错误。
从system.web.CDbHttpSession
两次单独调用DB后,似乎发生了死锁。system.web.CDbHttpSession是Yii框架的一部分。我不认为这是他们代码中的错误,因为我无法找到其他人遇到此问题。在过去的几个月里,我在Yii论坛上得到了ZERO的回应。我不能重复这个错误,它是随机发生的。这让我怀疑在php或mysql中有误配置?无论如何,我正试着解决这个问题。
怀疑这两个冲突的锁是在system.web.CDbHttpSession中发起的:清除过期的会话:
public function openSession($savePath,$sessionName)
......
$db->createCommand()->delete($this->sessionTableName,'expire<:expire',array(':expire'=>time()));
......
}
并更新用户的会话
public function regenerateID($deleteOldSession=false)
......
if($deleteOldSession)
$db->createCommand()->update($this->sessionTableName,array(
'id'=>$newID
),'id=:oldID',array(':oldID'=>$oldID));
.....
会话配置示例:
'session' => array(
'class' => 'system.web.CDbHttpSession',
'timeout' => (86400 * 30), //set timeout to 30 days
...
数据库类型:带有REPEATABLE-READ的InnoDB。
数据库结构:
CREATE TABLE IF NOT EXISTS `tbl_session` (
`id` char(32) NOT NULL,
`expire` int(11) DEFAULT NULL,
`data` longblob,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
MySql信息:
------------------------
LATEST DETECTED DEADLOCK
------------------------
140203 14:49:52
*** (1) TRANSACTION:
TRANSACTION 10FB67A3, ACTIVE 0 sec updating or deleting
mysql tables in use 1, locked 1
LOCK WAIT 3 lock struct(s), heap size 1248, 2 row lock(s), undo log
entries 1
MySQL thread id 7460001, OS thread handle 0x4a1d3940, query id
230752337 localhost dbUserName Updating
UPDATE `tbl_session` SET `id`='b04gso5930mssafq6c3m7hrfj4' WHERE
id='tuql5l5iru9cfim5u9qt81ld40'
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 1124 n bits 152 index `PRIMARY` of
table `dbTableName`.`tbl_session` trx id 10FB67A3 lock_mode X
locks gap before rec insert intention waiting
Record lock, heap no 40 PHYSICAL RECORD: n_fields 5; compact format;
info bits 0
0: len 30; hex
6230347364736463676c7162746438376e63326270667666343220202020; asc
b04sdsdcglqbtd87nc2bpfvf42 ; (total 32 bytes);
1: len 6; hex 00000f79076c; asc y l;;
2: len 7; hex fe00000bad0110; asc ;;
3: len 4; hex d2fb14fa; asc ;;
4: len 30; hex
323134343833306666383235623135613538313738666561383839643237; asc
2144830ff825b15a58178fea889d27; (total 93 bytes);
*** (2) TRANSACTION:
TRANSACTION 10FB67A1, ACTIVE 0 sec fetching rows
mysql tables in use 1, locked 1
1067 lock struct(s), heap size 113080, 69260 row lock(s)
MySQL thread id 7460002, OS thread handle 0x49a35940, query id
230752335 localhost dbUserName updating
DELETE FROM `tbl_session` WHERE expire<'1391467792'
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 0 page no 1124 n bits 152 index `PRIMARY` of
table `dbTableName`.`tbl_session` trx id 10FB67A1 lock_mode X
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format;
info bits 0
0: len 8; hex 73757072656d756d; asc supremum;;