Điểm:1

Có một rollback giao dịch cơ sở dữ liệu nếu một thời gian chờ PHP/Gateway/kết nối bị ngắt/mất xảy ra?

lá cờ ca

Tôi đang sử dụng Drupal phía sau lớp bộ đệm/proxy đảo ngược (ví dụ: Cloud Front/Akamai) và đôi khi dịch vụ hoạt động khá chậm (vì vậy tôi bị hết thời gian chờ trên Cổng, vì những lý do như có quá nhiều người đang sử dụng máy chủ) hoặc có điều gì đó tồi tệ xảy ra trong trang trại máy chủ (kiến trúc vi mô docker) và vì vậy tôi nhận được 502 Bad Gateway.

Chúng ta có biết liệu một giao dịch cơ sở dữ liệu có quay trở lại trong những trường hợp như vậy không? Điều này đặc biệt phù hợp khi thực hiện hơn 800 cập nhật thực thể thông qua API hàng loạt.

Ví dụ. (dựa trên mã giả: https://www.drupal.org/docs/drupal-apis/database-api/database-transactions)


$transaction = $connection->startTransaction();

cố gắng {
  // Làm một số việc ghi vào cơ sở dữ liệu.
  $entity = create_some_entity();
  $entity->save();

  // Giả sử đã xảy ra lỗi 502 Bad Gateway hoặc Gateway timeout tại đây.

  // Thực hiện ghi cơ sở dữ liệu khác phụ thuộc vào cơ sở dữ liệu đầu tiên.
  $dependent_entity = update_dependent_entity($entity->id());
  $dependent_entity->save();
}
bắt (\Ngoại lệ $e) {
  // Có lỗi khi ghi vào cơ sở dữ liệu nên cơ sở dữ liệu bị khôi phục
  // đến trạng thái khi giao dịch được bắt đầu.
  // Không chắc chắn nếu bắt một ngoại lệ sẽ làm bất cứ điều gì ở đây.
  // (vì không có ngoại lệ nào được mong đợi)
  $giao dịch->rollBack();
}

// Thực hiện giao dịch bằng cách hủy đặt biến $transaction.
hủy đặt ($ giao dịch);
Điểm:2
lá cờ us

Một giao dịch chỉ được khôi phục khi Giao dịch::rollBack() được gọi một cách rõ ràng. Trong trường hợp hết thời gian, điều đó không xảy ra.
Trên thực tế, trong trường hợp đó, các thay đổi cơ sở dữ liệu thậm chí không được cam kết, vì điều đó chỉ xảy ra khi Giao dịch::__destroy() được gọi là.

hàm công khai __destroy() {
  // Nếu chúng tôi quay lại thì giao dịch đã được thực hiện.
  if (!$this->rolledBack) {
    $this->connection->popTransaction($this->name);
  }
}
lá cờ ca
Còn trong trường hợp người dùng (trình duyệt web) ngắt kết nối hoặc proxy ngược ngắt kết nối (vì vậy PHP chưa hết thời gian chờ)
apaderno avatar
lá cờ us
Nếu máy chủ được đặt để chờ dữ liệu từ kết nối cơ sở dữ liệu ít hơn thời gian cần thiết để PHP hết thời gian chờ, giao dịch sẽ được khôi phục (giả sử rằng thời gian chờ kết nối cơ sở dữ liệu gây ra ngoại lệ PHP). Nếu không, PHP sẽ hết thời gian chờ đợi câu trả lời không bao giờ quay lại (và không có ngoại lệ nào được đưa ra). Ngoài ra, vì là xử lý hàng loạt nên khi trình duyệt mất kết nối với máy chủ, quá trình xử lý hàng loạt sẽ bị gián đoạn.
lá cờ ca
Những tuyên bố này dường như gợi ý rằng giao dịch sẽ được khôi phục trong trường hợp quy trình PHP gặp sự cố hoặc kết nối mạng không thành công giữa PHP và máy chủ MySQL `Đây là một biện pháp an toàn để giúp tránh sự không nhất quán trong trường hợp tập lệnh kết thúc bất ngờ--nếu bạn đã không thực hiện giao dịch một cách rõ ràng, thì người ta cho rằng đã xảy ra sự cố, do đó, quá trình khôi phục được thực hiện để đảm bảo an toàn cho dữ liệu của bạn.` (https://www.php.net/manual/en/pdo.transactions. php). […]
lá cờ ca
`Điều đó có nghĩa là nếu phiên của bạn bị ngắt kết nối vì bất kỳ lý do gì, do lựa chọn hoặc lý do khác do xảy ra lỗi như kết nối mạng không thành công, v.v., thì một giao dịch đang diễn ra sẽ bị hủy bỏ.` (https://dba.stackexchange.com /a/60005), `Tôi biết giao dịch sẽ bị khôi phục nếu kết nối bị ngắt trước khi thực hiện.` (https://dba.stackexchange.com/q/215579) `Nếu bạn đã tắt tính năng tự động thực hiện, mọi giao dịch không được thực hiện luôn được khôi phục vào cuối phiên.` (https://stackoverflow.com/a/65213497/5150644)
lá cờ ca
Vì vậy, tôi có đúng không khi đề xuất Drupal thực hiện khôi phục trong trường hợp này (lỗi PHP hoặc kết nối bị ngắt)? Ngoài ra câu trả lời của bạn, trả lời trong lời khẳng định? (giao dịch về cơ bản là 'khôi phục' vì các câu lệnh không bao giờ được cam kết ngay từ đầu)?

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.