的PHP Documentation說:瞭解PDO MySQL的交易
如果你從來沒有遇到過的交易,他們提供了4個大 特點:原子性,一致性,隔離性和持久性(ACID)。在非專業人士的條件下,任何在交易中進行的工作,即使是分階段進行的 ,都會保證安全地應用於數據庫 ,並且在承諾時,不受其他連接的干擾。
問題:
這是否意味着我可以同時運行交易兩個獨立的PHP腳本沒有他們相互干擾?
詳細闡述了我的意思 「INTERFERING」 :
假設我們有以下employees
表:
__________________________
| id | name | salary |
|------+--------+----------|
| 1 | ana | 10000 |
|------+--------+----------|
如果我有兩個腳本具有類似/相同的代碼,他們在同一時間運行:
script1.php和script2.php(兩者都具有相同的碼):
$conn->beginTransaction();
$stmt = $conn->prepare("SELECT * FROM employees WHERE name = ?");
$stmt->execute(['ana']);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$salary = $row['salary'];
$salary = $salary + 1000;//increasing salary
$stmt = $conn->prepare("UPDATE employees SET salary = {$salary} WHERE name = ?");
$stmt->execute(['ana']);
$conn->commit();
並且假設事件的序列如下:
script1.php選擇數據
script2.php選擇數據
script1.php更新數據
script2.php更新數據
script1.php提交()發生
script2.php提交()發生
在這種情況下,ana的最終薪水是多少?
會是11000嗎?那麼這是否意味着1次交易會與另一次交易重疊,因爲這些信息是在任何提交發生前獲得的?
它會是12000嗎?那麼這是否意味着無論數據更新和選擇的順序如何,
commit()
函數都會迫使這些函數單獨發生?
請隨意詳細闡述事務和單獨腳本如何相互干擾(或不干擾)。
我敢肯定的'SQLSTATE [23000]:完整性約束違規錯誤將彈出其中一個腳本。問題是如果他們都在同一時間運行哪一個。 – icecub