Răsfoiți Sursa

#3330 MySQL deadlocks when InnoDB is used: sessions update

Alex Trofimov 5 ani în urmă
părinte
comite
b4cd258468
2 a modificat fișierele cu 12 adăugiri și 2 ștergeri
  1. 2 0
      inc/classes/BxDolSession.php
  2. 10 2
      inc/classes/BxDolSessionQuery.php

+ 2 - 0
inc/classes/BxDolSession.php

@@ -9,6 +9,8 @@
 
 
 if (!defined('BX_DOL_SESSION_LIFETIME'))
 if (!defined('BX_DOL_SESSION_LIFETIME'))
     define('BX_DOL_SESSION_LIFETIME', 3600);
     define('BX_DOL_SESSION_LIFETIME', 3600);
+if (!defined('BX_DOL_SESSION_SKIP_UPDATE'))
+    define('BX_DOL_SESSION_SKIP_UPDATE', 30);
 define('BX_DOL_SESSION_COOKIE', 'memberSession');
 define('BX_DOL_SESSION_COOKIE', 'memberSession');
 
 
 class BxDolSession extends BxDolFactory implements iBxDolSingleton
 class BxDolSession extends BxDolFactory implements iBxDolSingleton

+ 10 - 2
inc/classes/BxDolSessionQuery.php

@@ -32,8 +32,16 @@ class BxDolSessionQuery extends BxDolDb
     }
     }
     function save($sId, $aSet)
     function save($sId, $aSet)
     {
     {
-    	$aSet['id'] = $sId;
-        return (int)$this->query("REPLACE INTO `" . $this->sTable . "` SET " . $this->arrayToSQL($aSet) . ", `date`=UNIX_TIMESTAMP()") > 0;
+        $aSet['date'] = time();
+        $aUpdate = $aSet;
+        $aSet['id'] = $sId;
+        $aBind = $aSet;
+        unset($aBind['date']);
+
+        if ($this->getOne("SELECT `date` FROM `" . $this->sTable . "` WHERE `id` = :id AND `data` = :data AND `user_id` = :user_id AND `date` > UNIX_TIMESTAMP() - " . BX_DOL_SESSION_SKIP_UPDATE, $aBind))
+            return true;
+
+        return (int)$this->query("INSERT INTO `" . $this->sTable . "` SET " . $this->arrayToSQL($aSet) . " ON DUPLICATE KEY UPDATE " . $this->arrayToSQL($aUpdate)) > 0;
     }
     }
 	function update($sId, $aSet = array())
 	function update($sId, $aSet = array())
     {
     {