В SQLAlchemy, как я могу получить затронутые строки после обновления, используя оптимистическую блокировку? - PullRequest
0 голосов
/ 26 декабря 2018

Извините, что задал этот вопрос, но я не смог найти полезных ответов после поиска этого вопроса.

Я знал, что в сеансе SQLAlchemy, update() не будет работать, может быть, даже не общаться сбазы данных, пока вы не используете session.commit.

Вот мой код, я думаю, что навык, который я использую, называется optimistic lock:

with Session() as session:
    # get one record
    object = session.query(Table).where(key=param).limit(1)

    content = "here is the calculated value of my business"

    # update the record by the id of the gotten record 
    # if 2 thread get the same record and run into this update statement, I think only can success
    # because it is ensured by the MySQL MVCC
    Table.update(Table).set(Table.content = content).where(id = object.id)
    sessoin.commit()

Но у меня возникает вопрос, что если я захочу сделать что-то in the thread which got the lock послеsession.commit()?

Например, код, который я ожидаю, выглядит следующим образом:

affected_rows = sessoin.commit()
if affected_rows:
    do_something_after_get_lock_success()

Кто-нибудь может помочь?Большое спасибо!^ _ ^

1 Ответ

0 голосов
/ 26 декабря 2018

Согласно документам, ResultProxy имеет свойство rowcount.из этого можно получить затронутые строки.

, но учтите, что:

Этот атрибут возвращает количество совпавших строк, которое не обязательно совпадает с количеством строк, которые былифактически измененный - оператор UPDATE, например, может не иметь чистых изменений в данной строке, если заданные значения SET такие же, как те, которые уже присутствуют в строке.Такой ряд будет сопоставлен, но не изменен.В бэкэндах, которые поддерживают оба стиля, таких как MySQL, rowcount по умолчанию настроен так, чтобы возвращать счетчик совпадений во всех случаях.

см. здесь также для отличного объяснения Майка Байера об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...