[英]Mysql transaction not working as expected
我已經閱讀了很多有關mysql和事務的文檔,據我了解,當我在MySQL InnoDB中使用可重復讀取隔離級別並啟動事務時,會添加一些行,當我在這些行上進行選擇時,它們會MySQL在該事務中沒有看到。 例如:
function dotransaction() {
$result = mysqli_query("START TRANSACTION");
if (!$result) return false;
$result = mysqli_query("INSERT INTO t (f1,f2) VALUES (1,2)");
if (!$result) {
mysqli_query("ROLLBACK");
return false;
}
$result = mysqli_query("INSERT INTO t (f1,f2) VALUES (3,4)");
if (!$result) {
mysqli_query("ROLLBACK");
return false;
}
$result = mysqli_query("UPDATE t2 SET f3=(SELECT COUNT(*) AS count FROM t WHERE f1=1) WHERE f4=2");
if (!$result) {
mysqli_query("ROLLBACK");
return false;
}
}
如果我在PHP中執行以下代碼,它實際上會將表t2中的字段f3更新為1。 但是我沒想到,因為當我開始事務時,該事務從數據庫中讀取快照,並且無論我在何處使用select語句,它都使用第一個讀取快照而不是對表的修改。 當我從UPDATE語句中取出select語句時,它也滿足了count = 1。
你理解錯了。
在事務內可見對事務內數據所做的更改,因此您的SELECT語句將看到更新的行。
但是,這些更改在事務外部是不可見的,因此,如果另一個用戶同時連接到服務器並查詢這些行,他將看到它們處於未更改狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.