Tại sao phải xả nếu bạn có thể cam kết?
Là một người mới làm việc với cơ sở dữ liệu và sqlalchemy, các câu trả lời trước đó - flush()
gửi các câu lệnh SQL đến DB và commit()
vẫn tồn tại chúng - không rõ ràng với tôi. Các định nghĩa có ý nghĩa nhưng nó không rõ ràng ngay lập tức từ các định nghĩa tại sao bạn sẽ sử dụng tuôn ra thay vì chỉ cam kết.
Vì một cam kết luôn tuôn ra ( https://docs.sqlalchemy.org/en/13/orm/session_basics.html#commting ) những âm thanh này thực sự giống nhau. Tôi nghĩ vấn đề lớn cần làm nổi bật là việc xả nước không phải là vĩnh viễn và có thể được hoàn tác, trong khi đó một cam kết là vĩnh viễn, theo nghĩa là bạn không thể yêu cầu cơ sở dữ liệu hoàn tác cam kết cuối cùng (tôi nghĩ)
@snapshoe nhấn mạnh rằng nếu bạn muốn truy vấn cơ sở dữ liệu và nhận kết quả bao gồm các đối tượng mới được thêm vào, bạn cần phải xóa trước (hoặc đã cam kết, sẽ xóa cho bạn). Có lẽ điều này hữu ích cho một số người mặc dù tôi không chắc tại sao bạn lại muốn tuôn ra thay vì cam kết (ngoài câu trả lời tầm thường mà nó có thể được hoàn tác).
Trong một ví dụ khác, tôi đã đồng bộ hóa tài liệu giữa DB cục bộ và máy chủ từ xa và nếu người dùng quyết định hủy, tất cả các bổ sung / cập nhật / xóa sẽ được hoàn tác (nghĩa là không đồng bộ hóa một phần, chỉ đồng bộ hóa hoàn toàn). Khi cập nhật một tài liệu duy nhất, tôi quyết định chỉ cần xóa hàng cũ và thêm phiên bản cập nhật từ máy chủ từ xa. Nó chỉ ra rằng do cách viết sqlalchemy, thứ tự các hoạt động khi cam kết không được đảm bảo. Điều này dẫn đến việc thêm một phiên bản trùng lặp (trước khi cố gắng xóa phiên bản cũ), dẫn đến DB không có một ràng buộc duy nhất. Để giải quyết vấn đề này, tôi đã sử dụng flush()
để duy trì trật tự, nhưng tôi vẫn có thể hoàn tác nếu sau đó quá trình đồng bộ hóa không thành công.
Xem bài đăng của tôi về điều này tại: Có bất kỳ thứ tự nào để thêm so với xóa khi cam kết trong sqlalchemy
Tương tự, ai đó muốn biết liệu thứ tự thêm có được duy trì khi cam kết hay không, tức là nếu tôi thêm object1
rồi thêm object2
, có object1
được thêm vào cơ sở dữ liệu trước khi object2
SQLAlchemy lưu thứ tự khi thêm đối tượng vào phiên không?
Một lần nữa, ở đây có lẽ việc sử dụng tuôn ra () sẽ đảm bảo hành vi mong muốn. Vì vậy, tóm lại, một lần sử dụng cho tuôn ra là để cung cấp đảm bảo đơn hàng (tôi nghĩ), một lần nữa trong khi vẫn cho phép mình tùy chọn "hoàn tác" mà cam kết không cung cấp.
Autoflush và Autocommit
Lưu ý, autoflush có thể được sử dụng để đảm bảo các truy vấn hoạt động trên cơ sở dữ liệu được cập nhật vì sqlalchemy sẽ xóa trước khi thực hiện truy vấn. https://docs.sqlalchemy.org/en/13/orm/session_api.html#sqlalchemy.orm.session.Session.params.autoflush
Autocommit là một thứ khác mà tôi không hoàn toàn hiểu nhưng có vẻ như việc sử dụng nó không được khuyến khích:
https://docs.sqlalchemy.org/en/13/orm/session_api.html#sqlalchemy.orm.session.Session.params. tự động
Sử dụng bộ nhớ
Bây giờ câu hỏi ban đầu thực sự muốn biết về tác động của tuôn ra so với cam kết cho mục đích bộ nhớ. Vì khả năng tồn tại hay không là điều mà cơ sở dữ liệu cung cấp (tôi nghĩ), chỉ cần xả nước là đủ để giảm tải cho cơ sở dữ liệu - mặc dù cam kết không nên làm tổn thương (thực sự có thể giúp - xem bên dưới) nếu bạn không quan tâm đến việc hoàn tác .
sqlalchemy sử dụng tham chiếu yếu cho các đối tượng đã bị xóa: https://docs.sqlalchemy.org/en/13/orm/session_state_manler.html#session-references-behavior
Điều này có nghĩa là nếu bạn không có một đối tượng rõ ràng được giữ ở đâu đó, như trong danh sách hoặc chính tả, sqlalchemy sẽ không giữ nó trong bộ nhớ.
Tuy nhiên, sau đó bạn có cơ sở dữ liệu của những điều phải lo lắng. Có lẽ xả nước mà không cam kết đi kèm với một số hình phạt bộ nhớ để duy trì giao dịch. Một lần nữa, tôi mới biết điều này nhưng đây là một liên kết dường như gợi ý chính xác điều này: https://stackoverflow.com/a/15305650/764365
Nói cách khác, các cam kết sẽ làm giảm việc sử dụng bộ nhớ, mặc dù có lẽ có sự đánh đổi giữa bộ nhớ và hiệu năng ở đây. Nói cách khác, có lẽ bạn không muốn cam kết mỗi lần thay đổi cơ sở dữ liệu, mỗi lần một (vì lý do hiệu suất), nhưng chờ đợi quá lâu sẽ làm tăng mức sử dụng bộ nhớ.