Skip to content

Commit 22e6ea9

Browse files
committed
Adding option skipFastLockRound for transactions
1 parent 5a1da33 commit 22e6ea9

File tree

3 files changed

+36
-4
lines changed

3 files changed

+36
-4
lines changed

arango/database.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3020,6 +3020,7 @@ def begin_transaction(
30203020
allow_implicit: Optional[bool] = None,
30213021
lock_timeout: Optional[int] = None,
30223022
max_size: Optional[int] = None,
3023+
skip_fast_lock_round: Optional[bool] = None,
30233024
) -> "TransactionDatabase":
30243025
"""Begin a transaction.
30253026
@@ -3043,6 +3044,9 @@ def begin_transaction(
30433044
:type lock_timeout: int | None
30443045
:param max_size: Max transaction size in bytes.
30453046
:type max_size: int | None
3047+
:param skip_fast_lock_round: Whether to disable fast locking for write
3048+
operations.
3049+
:type skip_fast_lock_round: bool | None
30463050
:return: Database API wrapper object specifically for transactions.
30473051
:rtype: arango.database.TransactionDatabase
30483052
"""
@@ -3055,6 +3059,7 @@ def begin_transaction(
30553059
allow_implicit=allow_implicit,
30563060
lock_timeout=lock_timeout,
30573061
max_size=max_size,
3062+
skip_fast_lock_round=skip_fast_lock_round,
30583063
)
30593064

30603065
def begin_controlled_execution(
@@ -3191,6 +3196,8 @@ class TransactionDatabase(Database):
31913196
:param transaction_id: Initialize using an existing transaction instead of creating
31923197
a new transaction.
31933198
:type transaction_id: str | None
3199+
:param skip_fast_lock_round: Whether to disable fast locking for write operations.
3200+
:type skip_fast_lock_round: bool | None
31943201
"""
31953202

31963203
def __init__(
@@ -3204,6 +3211,7 @@ def __init__(
32043211
lock_timeout: Optional[int] = None,
32053212
max_size: Optional[int] = None,
32063213
transaction_id: Optional[str] = None,
3214+
skip_fast_lock_round: Optional[bool] = False,
32073215
) -> None:
32083216
self._executor: TransactionApiExecutor
32093217
super().__init__(
@@ -3218,6 +3226,7 @@ def __init__(
32183226
lock_timeout=lock_timeout,
32193227
max_size=max_size,
32203228
transaction_id=transaction_id,
3229+
skip_fast_lock_round=skip_fast_lock_round,
32213230
),
32223231
)
32233232

arango/executor.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,8 @@ class TransactionApiExecutor:
245245
:param transaction_id: Initialize using an existing transaction instead of starting
246246
a new transaction.
247247
:type transaction_id: str | None
248+
:param skip_fast_lock_round: Whether to disable fast locking for write operations.
249+
:type skip_fast_lock_round: bool | None
248250
"""
249251

250252
def __init__(
@@ -259,6 +261,7 @@ def __init__(
259261
max_size: Optional[int] = None,
260262
allow_dirty_read: bool = False,
261263
transaction_id: Optional[str] = None,
264+
skip_fast_lock_round: Optional[bool] = False,
262265
) -> None:
263266
self._conn = connection
264267

@@ -279,6 +282,8 @@ def __init__(
279282
data["lockTimeout"] = lock_timeout
280283
if max_size is not None:
281284
data["maxTransactionSize"] = max_size
285+
if skip_fast_lock_round is not None:
286+
data["skipFastLockRound"] = skip_fast_lock_round
282287

283288
if transaction_id is None:
284289
request = Request(

tests/test_transaction.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import pytest
2+
from packaging import version
23

34
from arango.database import TransactionDatabase
45
from arango.exceptions import (
@@ -16,14 +17,15 @@ def test_transaction_execute_raw(db, col, docs):
1617
# Test execute raw transaction
1718
doc = docs[0]
1819
key = doc["_key"]
19-
result = db.execute_transaction(
20-
command=f"""
20+
command = f"""
2121
function (params) {{
2222
var db = require('internal').db;
2323
db.{col.name}.save({{'_key': params.key, 'val': 1}});
2424
return true;
2525
}}
26-
""",
26+
""" # noqa: E702 E231 E272 E202
27+
result = db.execute_transaction(
28+
command=command,
2729
params={"key": key},
2830
write=[col.name],
2931
read=[col.name],
@@ -43,7 +45,7 @@ def test_transaction_execute_raw(db, col, docs):
4345
assert err.value.error_code == 10
4446

4547

46-
def test_transaction_init(db, bad_db, col, username):
48+
def test_transaction_init(db, db_version, bad_db, col, username):
4749
txn_db = db.begin_transaction()
4850

4951
assert isinstance(txn_db, TransactionDatabase)
@@ -68,6 +70,22 @@ def test_transaction_init(db, bad_db, col, username):
6870
bad_db.begin_transaction()
6971
assert err.value.error_code in {11, 1228}
7072

73+
# Test all options
74+
kwargs = dict(
75+
read=col.name,
76+
write=col.name,
77+
exclusive=[],
78+
sync=True,
79+
allow_implicit=False,
80+
lock_timeout=1000,
81+
max_size=1024 * 1024,
82+
)
83+
if db_version >= version.parse("3.12.1"):
84+
kwargs["skip_fast_lock_round"] = True
85+
txn_db = db.begin_transaction(**kwargs)
86+
assert isinstance(txn_db, TransactionDatabase)
87+
assert txn_db.transaction_id is not None
88+
7189

7290
def test_transaction_status(db, col, docs):
7391
txn_db = db.begin_transaction(read=col.name)

0 commit comments

Comments
 (0)