Мне нужно заблокировать запись при получении и обновлении его полей.
Это впервые, когда мне это нужно, поэтому я сделал тестовый класс, чтобы посмотреть, как все это работает (обещаю, что я больше не буду делать запросы в контроллере).
С браузером (chrome) я называю testisolationread, с другим (FF) testisolationwrite, который обновляется все время без проблем.
Я пытался с select () -> forUpdate () тоже с теми же результатами.
Я попытался добавить «С ИСПОЛЬЗОВАНИЕМ RS И ИСПОЛЬЗОВАТЬ ИСКЛЮЧИТЕЛЬНЫЕ ЗАМКИ» (поскольку выдает ошибку «С ИСПОЛЬЗОВАНИЕМ RS И ИСПОЛЬЗОВАТЬ RSI» И вот я здесь.
Любой совет?
Спасибо
класс Admin_testController extends Myprj_Controller_Main {
public function init(){
parent::init();
}
/**
* @return Strategic_Db_Adapter_Db2
* @throws Zend_Exception
*/
private function _getDb(){
$db = Zend_Registry::get('conn');
return $db;
}
public function testisolationreadAction(){
$this->_helper->layout()->disableLayout();
$this->_helper->viewRenderer->setNoRender(true);
$db = $this->_getDb();
try{
$select = $db->select()
->from('MYLIB/MYFILE', array('trim(FIELD01) as FIELD01'))->where("FIELD02 = '002654015-002'");
$stmt = $select->__toString()." WITH RR";
$result = $db->fetchRow($stmt);
sleep(10); //gives me the time to call testisolationwrite
$bind = array('FIELD01' => 'A');
$db->update('MYLIB/MYFILE', $bind, array("FIELD02 = '002654015-002'"));
$db->commit();
} catch(Exception $e){
print $stmt.'<br>';
print $e->getMessage();
$db->rollBack();
}
print '<pre>'.$stmt;
print_r($result);
}
public function testisolationwriteAction(){
$this->_helper->layout()->disableLayout();
$this->_helper->viewRenderer->setNoRender(true);
$db = $this->_getDb();
$vals = array('X', 'Y');
for($a = 0; $a < 20; $a++){
try{
$i = $vals[$a % 2];
$bind = array('FIELD01' => $i);
$db->update('MYLIB/MYFILE', $bind, "FIELD02 = '002654015-002'");
print 'SET :'.$i.' '.microtime().'<br>';
$db->commit();
} catch(Exception $e){
$db->rollBack();
}
}
}
}
Задача ещё не решена.
Других решений пока нет …