Я написал запрос с блокировкой базы данных (with_for_update
) и хочу его протестировать. Для этого я получаю блокировку записи продукта, а затем пытаюсь обновить ее в процессе.
Кажется, это работает, поскольку процесс завершается (т. Е. Обновление никогда не происходит из-за блокировки базы данных.
Однако, когда я снова пытаюсь получить продукт, чтобы подтвердить, что он не обновился, я получаю сообщение об ошибке:
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) SSL error: decryption failed or bad record mac
При поиске в Google выглядит так, будто я убиваю свой процесс не изящно, SessionManager мог просочиться к последующим вызовам.
Я пытался сделать expunge_all
перед повторной загрузкой продукта, чтобы очистить любой экземпляр SessionManager, но у меня не было особой удачи .. какие-нибудь советы?
def doomed_commit(product):
from flaskbase.orm import SessionManager
# Get a _new_ session.
with SessionManager.session(ContextObject()) as session:
product.name = 'BAD NAME'
session.add(product)
session.commit() # This is executing when the entire process is killed
# Nothing below this gets executed
raise Exception('Committed successfully?!')
def test
create_product_in_db()
with Product.get_all_with_lock() as product:
proc = multiprocessing.Process(target=doomed_commit, args=(product,))
proc.join(1)
proc.kill()
while proc.is_alive():
time.sleep(0.1)
# Getting exception on the next line
assert Product.get_all()[0].name != 'BAD NAME'