CẬP NHẬT mà không có mệnh đề WHERE khóa một bảng trong PostgreSQL?


9

Toàn bộ bảng UPDATE(không có WHEREmệnh đề cụ thể ) có khóa bảng trong PostgreSQL không? Ví dụ, nó ngăn hàng bị xóa / chèn?

Ví dụ: nếu tôi chạy UPDATE t1 SET key = 'value' Tôi có thể mong đợi không có hàng mới nào được chèn vào t1trong quá trình UPDATEthực thi không?

Nếu không, tôi có thể mong đợi UPDATEsẽ cập nhật ngay cả các hàng xuất hiện sau khi bắt đầu không? (khóa không có DEFAULT 'value'trong định nghĩa của nó)


Nếu nó đang cập nhật các hàng được chèn sau khi nó bắt đầu và có một quá trình liên tục chèn các hàng thì điều đó có nghĩa là câu lệnh cập nhật sẽ không bao giờ kết thúc?
Joe W

điểm tốt! Có, hầu như không thể UPDATEthực hiện theo cách như vậy để cập nhật các hàng mới được chèn.
ban đầu

Không, chỉ các hàng đã được thay đổi sẽ bị khóa. CẬP NHẬT không bao giờ khóa toàn bộ bảng.
a_horse_with_no_name

Câu trả lời:


15

CẬP NHẬT không có mệnh đề WHERE sẽ khóa tất cả các hàng trong bảng, nhưng sẽ không tự khóa bảng cho DML.

Các hàng không thể bị xóa khỏi một giao dịch khác vì chúng bị khóa.

Nhưng bạn có thể chèn các hàng mới mà không gặp vấn đề gì (giả sử chúng không vi phạm bất kỳ ràng buộc nào).

Bất kỳ hàng nào được chèn sau CẬP NHẬT sẽ không được nhìn thấy bởi câu lệnh CẬP NHẬT và do đó chúng sẽ không bị thay đổi.


bạn có thể vui lòng chia sẻ các liên kết trên tài liệu. Tôi đã không tìm thấy nhiều trong tài liệu chính thức nói chính xác UPDATEmà không có WHERE.
ban đầu

Và hàng CẬP NHẬT từ một giao dịch khác cũng sẽ thất bại do khóa hàng, đúng không?
tale852150

1
@origaminal Tài liệu được đề cập là tại postgresql.org/docs/civerse/explicit-locking.html , bốn tài liệu cuối cùng là những gì bạn đang gọi là 'khóa bảng' - mặc dù các khóa cho phép vẫn là một dạng khóa bảng sẽ ngăn chặn nỗ lực để có một khóa độc quyền.
SilverbackNet
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.