Đưa câu lệnh Chọn vào giao dịch


10

Sự khác biệt giữa 2 truy vấn này là gì:

START TRANSACTION;
SELECT * FROM orders WHERE id=1;
UPDATE orders SET username='John' WHERE id=1;
COMMIT;

Và không có giao dịch:

SELECT * FROM orders WHERE id=1;
UPDATE orders SET username='John' WHERE id=1;  

Ảnh hưởng của việc có SELECTmột giao dịch bên trong là gì?

Nếu DELETE FROM orders WHERE id=1được gọi từ một phiên khác ngay sau SELECTcả hai trường hợp, khi nào nó sẽ được xử lý?

Câu trả lời:


5

Bản thân một truy vấn CHỌN bên trong một giao dịch, không được bảo vệ chính xác khỏi các CẬP NHẬT và XÓA.

Những gì bạn cần sử dụng như sau:

Nếu bạn phát hành Delete From orders Where id=1, điều đó sẽ xảy ra khi các hàng trong ordersbảng đã giải phóng khóa của họ vào cuối giao dịch. Bạn có thể thử nghiệm (trên Máy chủ Dev / Staging) bằng cách sử dụng READ UNCOMMITTEDmức cô lập giao dịch để thực hiện xóa một cách hợp lý, nhưng chỉ khi cam kết thì nó mới hiển thị và được ghi lại vĩnh viễn.

Trong giao dịch thứ hai, về cơ bản tất cả các cược đã tắt. Nếu bạn chạy

select * From orders Where id=1;
UPDATE orders SET username="John" Where id=1;

chạy Delete From orders Where id=1sẽ cam kết ngay lập tức. Tùy thuộc vào thứ tự MySQL thực thi các câu lệnh này, bạn sẽ thấy (hoặc không thấy) các hàng xóa.

CAUPAT

MySQL 5.6 hiện có các mục sau :

  • START TRANSACTION READ WRITE;
  • START TRANSACTION READ ONLY;

Công cụ sửa đổi READ WRITE và READ CHỈ đặt chế độ truy cập giao dịch. Họ cho phép hoặc cấm thay đổi các bảng được sử dụng trong giao dịch. Hạn chế READ CHỈ ngăn giao dịch sửa đổi hoặc khóa cả hai bảng giao dịch và không giao dịch có thể nhìn thấy đối với các giao dịch khác; giao dịch vẫn có thể sửa đổi hoặc khóa các bảng tạm thời. Các sửa đổi này có sẵn kể từ MySQL 5.6.5.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.