簡體   English   中英

MySQL事務無法按預期工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM