Skip to content
Snippets Groups Projects
Commit d404a49a authored by Cédric Krier's avatar Cédric Krier :atom:
Browse files

Lock records when processing

issue8012
review60511002
parent 74209466
No related branches found
No related tags found
No related merge requests found
......@@ -370,6 +370,7 @@
('stripe_charge_id', '=', None),
])
for payment in payments:
cls.__lock([payment])
try:
charge = stripe.Charge.create(**payment._charge_parameters())
except (stripe.error.RateLimitError,
......@@ -432,6 +433,7 @@
or payment.stripe_captured
or payment.state != 'processing'):
continue
cls.__lock([payment])
try:
charge = stripe.Charge.retrieve(
payment.stripe_charge_id,
......@@ -469,6 +471,25 @@
'idempotency_key': idempotency_key,
}
@classmethod
def __lock(cls, records):
from trytond.tools import grouped_slice, reduce_ids
from sql import Literal, For
transaction = Transaction()
database = transaction.database
connection = transaction.connection
table = cls.__table__()
if database.has_select_for():
for sub_records in grouped_slice(records):
where = reduce_ids(table.id, sub_records)
query = table.select(
Literal(1), where=where, for_=For('UPDATE', nowait=True))
with connection.cursor() as cursor:
cursor.execute(*query)
else:
database.lock(connection, cls._table)
class Account(ModelSQL, ModelView):
"Stripe Account"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment