changeset d404a49a74d2 in modules/account_payment_stripe:5.0
details:
https://hg.tryton.org/modules/account_payment_stripe?cmd=changeset;node=d404a49a74d2
description:
Lock records when processing
issue8012
review60511002
diffstat:
payment.py | 21 +++++++++++++++++++++
1 files changed, 21 insertions(+), 0 deletions(-)
diffs (45 lines):
diff -r 742094666053 -r d404a49a74d2 payment.py
--- a/payment.py Sat Jan 26 01:12:03 2019 +0100
+++ b/payment.py Wed Feb 06 22:51:18 2019 +0100
@@ -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"