Для обновления - для psycopg2 курсор для postgres - PullRequest
0 голосов
/ 17 сентября 2018

Мы используем psycopg2 jsonb-курсор для извлечения данных и обработки, но при появлении нового потока или обработки он не должен извлекать и обрабатывать те же записи, что первый процесс или поток.

Для этого мы должны попытатьсяиспользуйте FOR UPDATE, но мы просто хотим знать, используем ли мы правильный синтаксис.

    con = self.dbPool.getconn()
    cur = conn.cursor()             
    sql="""SELECT jsondoc FROM %s WHERE jsondoc @> %s"”"             
    if 'sql' in queryFilter:                 
   sql += queryFilter 'sql’]   
   When we print this query, it will be shown as below:             
         Query: "SELECT jsondoc FROM %s WHERE jsondoc @> %s AND (jsondoc ->> ‘claimDate')::float <= 1536613219.0 AND ( jsondoc ->> ‘claimstatus' = ‘done' OR jsondoc ->> 'claimstatus' =                    'failed' ) limit 2 FOR UPDATE"         
 cur.execute(sql, (AsIs(self.tablename), Json(queryFilter),)) 
    cur.execute()
    dbResult = cur.fetchall()

Пожалуйста, помогите нам уточнить синтаксис и объяснить, если этот синтаксис правильный, тогда как этот запрос блокирует извлеченные записипервой нити.

Спасибо, Санджай.

1 Ответ

0 голосов
/ 17 сентября 2018

Если этот примерный запрос выполняется

select * 
from my_table
order by id
limit 2
for update; -- wrong

, тогда две результирующие строки блокируются до конца транзакции (т.е. следующие connection.rollback() или connection.commit() или соединение закрывается). Если другая транзакция попытается выполнить тот же запрос в течение этого времени, он будет остановлен, пока две строки не будут разблокированы. Так что не поведение, которое вы ожидаете. Вы должны добавить skip locked предложение:

select * 
from my_table
order by id
limit 2
for update skip locked; -- correct

В этом пункте вторая транзакция пропустит заблокированные строки и вернет следующие два момента без ожидания.

Читайте об этом в документации.

...