Bạn nói đúng:ở mức cách ly
tiêu chuẩn , read committed
, bạn không cần phải bọc các câu lệnh đã chọn trong các giao dịch. Các câu lệnh được chọn sẽ được bảo vệ khỏi các lần đọc bẩn cho dù bạn có gói chúng trong một giao dịch hay không.
connection 1: connection 2:
begin transaction
update user set name = 'Bill' where id = 1
select name from users where id = 1
rollback transaction
Câu lệnh select sẽ không đọc bản cập nhật quay lại:không quan trọng là chúng không được bao bọc trong một giao dịch.
Nếu bạn cần lần đọc có thể lặp lại , sau đó gói các lựa chọn trong một giao dịch mặc định không giúp ích gì:
connection 1: connection 2:
begin transaction
select name from users where id = 1
update user set name = 'Bill' where id = 1
select name from users where id = 1
commit transaction
begin
và commit
câu lệnh sẽ không hữu ích ở đây:select
thứ hai có thể đọc tên cũ hoặc có thể đọc tên mới.
Tuy nhiên, nếu bạn chạy ở mức cách ly cao hơn, chẳng hạn như serializable
hoặc repeatable read
, nhóm sẽ được bảo vệ khỏi các lần đọc không lặp lại:
connection 1: connection 2:
set transaction isolation level
repeatable read
begin transaction
select name from users where id = 1
update user set name = 'Bill' where id = 1
select name from users where id = 1 |
commit transaction |
|--> executed here
Trong trường hợp này, update
sẽ chặn cho đến khi giao dịch đầu tiên hoàn tất.
Mức độ cách ly cao hơn hiếm khi được sử dụng vì chúng làm giảm số lượng người có thể làm việc trong cơ sở dữ liệu cùng một lúc. Ở cấp cao nhất, serializable
, một truy vấn báo cáo sẽ tạm dừng mọi hoạt động cập nhật.