CC-5109: Fix race-condition when updating cc_pref table

This commit is contained in:
Martin Konecny 2013-05-07 16:21:34 -04:00
parent ad82b4ff98
commit 9f6a1033ea
2 changed files with 19 additions and 4 deletions

View file

@ -2,9 +2,11 @@
class Application_Common_Database class Application_Common_Database
{ {
public static function prepareAndExecute($sql, array $paramValueMap, public static function prepareAndExecute($sql, array $paramValueMap,
$type='all', $fetchType=PDO::FETCH_ASSOC) $type='all', $fetchType=PDO::FETCH_ASSOC, $con=null)
{ {
if (is_null($con)) {
$con = Propel::getConnection(); $con = Propel::getConnection();
}
$stmt = $con->prepare($sql); $stmt = $con->prepare($sql);
foreach ($paramValueMap as $param => $v) { foreach ($paramValueMap as $param => $v) {
$stmt->bindValue($param, $v); $stmt->bindValue($param, $v);

View file

@ -11,6 +11,9 @@ class Application_Model_Preference
private static function setValue($key, $value, $isUserValue = false, $userId = null) private static function setValue($key, $value, $isUserValue = false, $userId = null)
{ {
try { try {
$con = Propel::getConnection(CcPrefPeer::DATABASE_NAME);
$con->beginTransaction();
//called from a daemon process //called from a daemon process
if (!class_exists("Zend_Auth", false) || !Zend_Auth::getInstance()->hasIdentity()) { if (!class_exists("Zend_Auth", false) || !Zend_Auth::getInstance()->hasIdentity()) {
$id = NULL; $id = NULL;
@ -35,7 +38,11 @@ class Application_Model_Preference
$paramMap[':id'] = $userId; $paramMap[':id'] = $userId;
} }
$result = Application_Common_Database::prepareAndExecute($sql, $paramMap, 'column'); $result = Application_Common_Database::prepareAndExecute($sql,
$paramMap,
'column',
PDO::FETCH_ASSOC,
$con);
$paramMap = array(); $paramMap = array();
if ($result > 1) { if ($result > 1) {
@ -80,9 +87,15 @@ class Application_Model_Preference
$paramMap[':key'] = $key; $paramMap[':key'] = $key;
$paramMap[':value'] = $value; $paramMap[':value'] = $value;
Application_Common_Database::prepareAndExecute($sql, $paramMap, 'execute'); Application_Common_Database::prepareAndExecute($sql,
$paramMap,
'execute',
PDO::FETCH_ASSOC,
$con);
$con->commit();
} catch (Exception $e) { } catch (Exception $e) {
$con->rollback();
header('HTTP/1.0 503 Service Unavailable'); header('HTTP/1.0 503 Service Unavailable');
Logging::info("Database error: ".$e->getMessage()); Logging::info("Database error: ".$e->getMessage());
exit; exit;