Có hai cách để lồng các giao dịch trong SQLAlchemy. Một là các giao dịch ảo, trong đó SQLAlchemy theo dõi số lượng lệnh bắt đầu mà bạn đã phát hành và phát hành các cam kết chỉ khi giao dịch ngoài cùng cam kết. Tuy nhiên, việc khôi phục được phát hành ngay lập tức. Bởi vì giao dịch là ảo - tức là cơ sở dữ liệu không biết gì về việc lồng nhau, bạn không thể làm bất cứ điều gì với phiên đó sau khi khôi phục cho đến khi bạn khôi phục tất cả các giao dịch bên ngoài. Để cho phép sử dụng các giao dịch ảo, hãy thêm đối số subtransactions=True
vào cuộc gọi begin()
. Tính năng này tồn tại để cho phép bạn sử dụng kiểm soát giao dịch bên trong các chức năng có thể gọi cho nhau mà không theo dõi nếu bạn đang ở trong một giao dịch hay không. Để có ý nghĩa, hãy định cấu hình phiên bằng autocommit=True
và luôn phát hành session.begin(subtransactions=True)
trong chức năng giao dịch.
Cách khác để lồng các giao dịch là sử dụng các giao dịch lồng nhau thực. Chúng được thực hiện bằng cách sử dụng savepoints. Nếu bạn quay trở lại một giao dịch lồng nhau, tất cả các thay đổi được thực hiện trong giao dịch đó được khôi phục, nhưng giao dịch bên ngoài vẫn có thể sử dụng được và mọi thay đổi được thực hiện bởi giao dịch bên ngoài vẫn ở đó. Để sử dụng vấn đề giao dịch lồng nhau session.begin(nested=True)
hoặc chỉ session.begin_nested()
. Giao dịch lồng nhau không được hỗ trợ cho tất cả các cơ sở dữ liệu. kiểm tra thư viện bộ cấu hình chức năng SQLAlchemy của sqlalchemy.test.requires.savepoints
nói này về sự hỗ trợ:
emits_warning_on('mssql', 'Savepoint support in mssql is experimental and may lead to data loss.'),
no_support('access', 'not supported by database'),
no_support('sqlite', 'not supported by database'),
no_support('sybase', 'FIXME: guessing, needs confirmation'),
exclude('mysql', '<', (5, 0, 3), 'not supported by database')
Về giao dịch lồng nhau PostgreSQL SQLAlchemy chỉ làm việc tốt.
Nguồn
2010-02-25 21:44:35
Giao dịch lồng nhau (ví dụ: AUTONOMOUS_TRANSACTION của Oracle) được coi là chống mẫu ngoài hai trường hợp: Kiểm tra (do đó, thử được kiểm tra ngay cả khi câu lệnh quay lại) và Ghi nhật ký lỗi (để nắm bắt vị trí/khi lỗi xảy ra). Tất cả các trường hợp khác nên sử dụng savepoints. Heck, phạm vi giao dịch không thuộc về việc bị xử lý trong bất kỳ chức năng hoặc thủ tục nào; nó phải là trách nhiệm cuối cùng của người gọi để cam kết hoặc quay trở lại. –
Đó là sự chuyển đổi. – user