Hãy giúp tôi tìm hiểu sự hiểu lầm của mình.App Engine, giao dịch và idempotency
Tôi đang viết một RPG trên App Engine. Một số hành động mà người chơi sẽ sử dụng một số liệu thống kê nhất định. Nếu chỉ số đạt đến 0 thì người chơi không thể thực hiện thêm hành động nào. Tôi bắt đầu lo lắng về người chơi gian lận, mặc dù - nếu một người chơi gửi hai hành động rất nhanh, ngay bên cạnh nhau? Nếu mã giảm số liệu thống kê không có trong giao dịch, thì người chơi có cơ hội thực hiện hành động hai lần. Vì vậy, tôi nên quấn mã mà giảm số liệu trong một giao dịch, phải không? Càng xa càng tốt.
Trong GAE Python, tuy nhiên, chúng tôi có điều này trong documentation:
Note: Nếu ứng dụng của bạn nhận được một ngoại lệ khi nộp một giao dịch, nó không luôn có nghĩa là giao dịch thất bại. Bạn có thể nhận được Timeout, TransactionFailedError hoặc ngoại lệ InternalError trong trường hợp giao dịch đã được cam kết và cuối cùng sẽ áp dụng thành công . Bất cứ khi nào có thể, hãy thực hiện các giao dịch Datastore của bạn một cách không cần thiết để rằng nếu bạn lặp lại một giao dịch, kết quả cuối cùng sẽ giống nhau.
Rất tiếc. Điều đó có nghĩa là chức năng tôi đang chạy có dạng như sau:
def decrement(player_key, value=5):
player = Player.get(player_key)
player.stat -= value
player.put()
Vâng, điều đó không hiệu quả vì điều này không phải là không đáng tin cậy, phải không? Nếu tôi đặt một vòng lặp thử lại xung quanh nó (tôi cần phải trong Python? Tôi đã đọc mà tôi không cần phải trên SO ... nhưng tôi không thể tìm thấy nó trong tài liệu) nó có thể tăng giá trị hai lần, đúng? Kể từ khi mã của tôi có thể bắt một ngoại lệ nhưng kho dữ liệu vẫn cam kết dữ liệu ... huh? Làm thế nào để sửa lỗi này? Đây có phải là trường hợp tôi cần distributed transactions không? Tôi có thực sự?
Vâng, vâng, và đó là một điểm tốt ... nhưng trước khi tôi vứt bỏ mã của mình với một loạt khó chẩn đoán, khó khăn sinh sản lỗi Tôi muốn tìm hiểu những gì tôi nên đi mô hình ở đây. –
Mẫu của bạn đang đi đúng hướng, nhưng GAE có một số sắc thái khó chịu khiến cho việc triển khai chính xác khó khăn như thế này. Theo kinh nghiệm của tôi với GAE, đôi khi nó có giá trị nỗ lực, và đôi khi nó không. –
@TravisWebb Không đồng ý. An toàn giao dịch không phải là 'tối ưu hóa sớm', cũng không phải là xung đột giao dịch đặc biệt là không thể xảy ra. –