我们可以在Zend-Db中执行查询时锁定表

时间:2009-10-20 11:17:24

标签: zend-framework zend-db

我说的是做这样的事情:

LOCK TABLE页面WRITE;

SELECT * FROM page WHERE col ='value';

INSERT INTO页面(col1,col2)VALUES('val1',val2);

UNLOCK TABLES;

4 个答案:

答案 0 :(得分:8)

我没有看到用于锁定表的实际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();
}

我最近遇到了同样的问题,交易效果很好。绝对是要走的路。

答案 1 :(得分:2)

Zend_Db交易保证锁定!请参阅此有关如何进行适当的隔离交易的信息。

Database transactions in Zend Framework: Are they isolated?

答案 2 :(得分:1)

$ this-> _db-> getConnection() - > exec('LOCK TABLES page');

答案 3 :(得分:0)

我认为您需要使用适配器,但我不确定锁定是否有效。

$ model-> getAdapter() - > query($ sql,$ bind);