MySQL会话表中的随机死锁 - Yii

时间:2014-03-23 06:37:18

标签: php mysql session yii deadlock

我在用户登录时在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;;

0 个答案:

没有答案