2008-11-25 28 views
5

Trong dự án mà tôi đang làm việc, có một bảng có trình kích hoạt "cập nhật", theo dõi nếu cột boolean đã thay đổi (ví dụ: false -> true = thực hiện một số hành động). Nhưng hành động này chỉ có thể được thực hiện một lần cho một hàng.Đồng thời Postgresql

Sẽ có nhiều khách hàng truy cập cơ sở dữ liệu, vì vậy tôi có thể giả định rằng cuối cùng, nhiều khách hàng sẽ cố gắng cập nhật cùng một hàng hàng song song.

Trình kích hoạt "cập nhật" có tự xử lý đồng thời hay không hoặc tôi cần thực hiện giao dịch đó và khóa bảng theo cách thủ công?

+0

Bạn có quan sát thấy hiệu suất giảm đáng kể khi có nhiều trình kích hoạt được kích hoạt cùng một lúc không? – ady

Trả lời

17

Trình kích hoạt không xử lý đồng thời và PostgreSQL nên làm điều đúng cho dù bạn có sử dụng giao dịch rõ ràng hay không.

PostgreSQL sử dụng khóa lạc quan có nghĩa là người đầu tiên thực sự cập nhật hàng sẽ có khóa trên hàng đó. Nếu người thứ hai cố gắng cập nhật hàng, câu lệnh cập nhật của họ chờ xem liệu người đầu tiên có cam kết thay đổi hay quay lại hay không.

Nếu người đầu tiên cam kết, người thứ hai nhận được lỗi, thay vì thay đổi của họ thông qua và xóa bỏ một thay đổi có thể thú vị với họ.

Nếu người đầu tiên quay trở lại, cập nhật của người thứ hai bỏ chặn và đi qua bình thường, bởi vì bây giờ nó sẽ không ghi đè bất cứ điều gì.

Người thứ hai cũng có thể sử dụng tùy chọn NOWAIT, điều này làm cho lỗi xảy ra ngay lập tức thay vì chặn, nếu cập nhật của họ xung đột với thay đổi chưa được giải quyết.

+1

+1 để sử dụng từ "xóa". – swasheck