2014-11-22 121 views
0

我很新來使用數據庫。我目前正在使用Google Cloud SQL並通過PHP PDO訪問數據庫。查詢時暫時鎖定MYSQL表?

我設法找到了一些示例代碼網站(http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers):

<?php 
try { 
    $db->beginTransaction(); //<---- 1 

    $db->exec("SOME QUERY"); //<---- 2 

    $stmt = $db->prepare("SOME OTHER QUERY?"); 
    $stmt->execute(array($value)); 

    $stmt = $db->prepare("YET ANOTHER QUERY??"); 
    $stmt->execute(array($value2, $value3)); 

    $db->commit(); //<---- 3 
} catch(PDOException $ex) { 
    //Something went wrong rollback! 
    $db->rollBack(); 
    echo $ex->getMessage(); 
} 

根據上面的代碼,如果我這樣做 '$ DB->的BeginTransaction();',是否會開始鎖定桌子?然後'$ db-> exec(「SOME QUERY」);'將是正常的。最後,'$ db-> commit();'會保存上面的所有內容並解鎖桌子?

如果一切運行正常,那麼我應該假設在第2行正在運行時,沒有其他呼叫可以完成(它們將排隊),並且其他呼叫只能在此處呼叫第3行時開始?我只想知道我對這個過程的理解(以及代碼的寫法)是否準確。

+0

是的,一個事務將停止對exec語句中的表進行任何更改。你可以得到完整的詳細信息(還有更多的不僅僅是這個)[在mysql文檔](http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-transactions.html )交易。 – Fluffeh 2014-11-22 22:20:02

回答

0

首先,由於您使用的是try/catch,因此您要確保PDO的錯誤模式是例外情況:http://php.net/manual/en/pdo.error-handling.php,默認情況下它是無聲的。

然後,是的,當查詢失敗時,PDO應該發出一個異常,它會停止執行try節。在catch期間,您應該發出rollBack(),如果一切成功,您應該發出commit()。所以你對我的看法是否正確。

在您開始交易後,在您運行commit()之前,該連接中的任何內容都不會被保存。 rollBack()結束一個事務並返回到自動提交模式,而不保存任何更改。

http://php.net/manual/en/pdo.begintransaction.php

關閉自動提交模式下。在自動提交模式關閉的情況下,在通過調用PDO :: commit()結束事務之前, 通過PDO對象實例對數據庫所做的更改不是 。 調用PDO :: rollBack()將回滾對數據庫的所有更改,並且 將連接返回到自動提交模式。