Việc sử dụng stored procedures có thể thực hiện nhanh hơn so với việc cài đặt các logic trong các ngôn ngữ lập trình. Tuy nhiên chúng ta vẫn có những giải pháp khác để thay thế cho stored procedures, và một trong giải pháp đó là chính sách quản lý giao dịch trong các ngôn ngữ lập trình ứng dụng. Ví dụ xét các thao tác cho việc đặt phòng được viết trong các stored procedures là script update table “Booking” như sau:
UPDATE booking SET customer = ? WHERE booking_id = ?;
Nếu như chúng ta thêm vào 2 field “last_update_timestamp” và “last_update_user”, thì câu lệnh SQL trên sẽ hoạt động hiệu quả hơn trong môi trường “multiserver”.
UPDATE booking
SET customer = ?, last_update_timestamp = ?, last_update_user = ?
WHERE booking_id = ? AND last_update_timestamp = ? AND last_update_user = ?;
Nhận xét: Trong trường hợp này thì khách hàng đầu tiên sẽ book một phòng cho một ngày và thành công. Khách hàng thứ hai sẽ cố gắng cập nhật record, tuy nhiên kết quả cập nhật là thất bại vì điều kiện cập nhật không thỏa “ast_update_timestamp” và “last_update_user”. Cách tiếp cận này hoạt động tốt miễn là không xảy ra trường hợp “deadlocks” trong các giao dịch. Một “deadlock” giữa hai giao dịch, khi một giao dịch phải chờ một giao dịch khác unlock khóa.
Một sự lựa chọn khác là chúng ta có thể tạo ra các cơ chế để quản lý các khóa. Ví dụ như đối với table “Room”, chúng ta có thể bổ sung thêm hai cột locked_by và
locked_timestamp cho quá trình đặt phòng. Trước khi các giao dịch đặt phòng bắt đầu, các cột locked_by và locked_timestamp sẽ được cập nhật. Sau khi các giao dịch hoàn tất thì các khóa sẽ được giải phóng. Phương pháp đòi hỏi có hai giao dịch cơ sở dữ liệu khác nhau, do đó nó có nguy cơ là tồn tại một khóa luôn mở, điều này có thể ngăn chặn người khác đặt bất kỳ phòng nào vào các ngày. Chúng ta có thể loại bỏ vấn đề này thông qua hai giải pháp sau:
Các phòng được xem là mở khóa không chỉ các cột locked_by và locked_timestamp có giá trị NULL, mà nó có thể được tổ chức trong một thời gian dài.
Khi cập nhật các khóa vào cuối các giao dịch đặt phòng, sử dụng locked_by và locked_timestamp, kết hợp với mệnh đề Where. Vì vậy nếu có ai đó đánh cắp bất kỳ một khóa nào, thì chúng ta có thể roll back các giao dịch.