【发布时间】:2009-10-20 11:17:23
【问题描述】:
我说的是做这样的事情:
LOCK TABLE 页面写入;
SELECT * FROM page WHERE col = 'value';
插入页面(col1, col2) VALUES('val1', val2);
解锁表格;
【问题讨论】:
我说的是做这样的事情:
LOCK TABLE 页面写入;
SELECT * FROM page WHERE col = 'value';
插入页面(col1, col2) VALUES('val1', val2);
解锁表格;
【问题讨论】:
我没有看到真正的 Zend DB 方法来锁定表,但也许只是这样做:
//Lock Table
$sql = "LOCK TABLE page WRITE";
$db->fetchRow($sql);
//Get your data
$sql = "SELECT * FROM page WHERE col='value'";
$result = $db->fetchAll($sql);
//Make the insert
$data = array( 'col1' => 'val1', 'col2' => 'val2' );
$db->insert('page', $data);
//Unlock tables
$sql = "UNLOCK TABLES";
$db->fetchRow($sql);
可能不是最佳解决方案,并且未经测试。但它可能对你有用。
更新:我为您找到了更好的解决方案。使用transactions:
// Start a transaction explicitly.
$db->beginTransaction();
try {
//Get your data
$sql = "SELECT * FROM page WHERE col='value'";
$result = $db->fetchAll($sql);
//Make the insert
$data = array( 'col1' => 'val1', 'col2' => 'val2' );
$db->insert('page', $data);
// If all succeed, commit the transaction and all changes
// are committed at once.
$db->commit();
} catch (Exception $e) {
// If any of the queries failed and threw an exception,
// we want to roll back the whole transaction, reversing
// changes made in the transaction, even those that succeeded.
// Thus all changes are committed together, or none are.
$db->rollBack();
echo $e->getMessage();
}
我最近遇到了同样的问题,并且交易效果很好。绝对是要走的路。
【讨论】:
Zend_Db 事务不保证锁!请参阅此处了解如何进行正确的隔离交易。
【讨论】:
$this->_db->getConnection()->exec('LOCK TABLES page');
【讨论】:
我认为您需要使用适配器,但我不确定锁定是否有效。
$model->getAdapter()->query($sql, $bind);
【讨论】: