Skip to content

Commit 44f69bb

Browse files
committed
.run on a failed transaction will also fail
1 parent 540af77 commit 44f69bb

File tree

4 files changed

+29
-28
lines changed

4 files changed

+29
-28
lines changed

neo4j/work/result.py

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,7 @@
2323
from warnings import warn
2424

2525
from neo4j.data import DataDehydrator
26-
from neo4j.exceptions import (
27-
ServiceUnavailable,
28-
SessionExpired,
29-
)
26+
from neo4j.exceptions import Neo4jError
3027
from neo4j.work.summary import ResultSummary
3128

3229

@@ -39,17 +36,16 @@ class _ConnectionErrorHandler:
3936
The error will be re-raised after the callback.
4037
"""
4138

42-
def __init__(self, connection, on_network_error):
39+
def __init__(self, connection, on_error):
4340
"""
4441
:param connection the connection object to warp
4542
:type connection Bolt
46-
:param on_network_error the function to be called when a method of
47-
connection raises of of the caught errors. The callback takes the
48-
error as argument.
49-
:type on_network_error callable
43+
:param on_error the function to be called when a method of
44+
connection raises of of the caught errors.
45+
:type on_error callable
5046
"""
5147
self._connection = connection
52-
self._on_network_error = on_network_error
48+
self._on_error = on_error
5349

5450
def __getattr__(self, item):
5551
connection_attr = getattr(self._connection, item)
@@ -58,11 +54,16 @@ def __getattr__(self, item):
5854

5955
def outer(func):
6056
def inner(*args, **kwargs):
57+
failed = False
6158
try:
6259
func(*args, **kwargs)
60+
except Neo4jError:
61+
failed = True
62+
self._on_error()
63+
raise
6364
finally:
64-
if self._connection.defunct():
65-
self._on_network_error()
65+
if not failed and self._connection.defunct():
66+
self._on_error()
6667
return inner
6768

6869
return outer(connection_attr)
@@ -75,8 +76,8 @@ class Result:
7576
"""
7677

7778
def __init__(self, connection, hydrant, fetch_size, on_closed,
78-
on_network_error):
79-
self._connection = _ConnectionErrorHandler(connection, on_network_error)
79+
on_error):
80+
self._connection = _ConnectionErrorHandler(connection, on_error)
8081
self._hydrant = hydrant
8182
self._on_closed = on_closed
8283
self._metadata = None

neo4j/work/simple.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ def _result_closed(self):
137137
self._autoResult = None
138138
self._disconnect()
139139

140-
def _result_network_error(self):
140+
def _result_error(self):
141141
if self._autoResult:
142142
self._autoResult = None
143143
self._disconnect()
@@ -227,7 +227,7 @@ def run(self, query, parameters=None, **kwparameters):
227227

228228
self._autoResult = Result(
229229
cx, hydrant, self._config.fetch_size, self._result_closed,
230-
self._result_network_error
230+
self._result_error
231231
)
232232
self._autoResult._run(
233233
query, parameters, self._config.database,
@@ -261,7 +261,7 @@ def _transaction_closed_handler(self):
261261
self._transaction = None
262262
self._disconnect()
263263

264-
def _transaction_network_error_handler(self):
264+
def _transaction_error_handler(self):
265265
if self._transaction:
266266
self._transaction = None
267267
self._disconnect()
@@ -272,7 +272,7 @@ def _open_transaction(self, *, access_mode, database, metadata=None,
272272
self._transaction = Transaction(
273273
self._connection, self._config.fetch_size,
274274
self._transaction_closed_handler,
275-
self._transaction_network_error_handler
275+
self._transaction_error_handler
276276
)
277277
self._transaction._begin(database, self._bookmarks, access_mode,
278278
metadata, timeout)

neo4j/work/transaction.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,14 @@ class Transaction:
3838
3939
"""
4040

41-
def __init__(self, connection, fetch_size, on_closed, on_network_error):
41+
def __init__(self, connection, fetch_size, on_closed, on_error):
4242
self._connection = connection
4343
self._bookmark = None
4444
self._results = []
4545
self._closed = False
4646
self._fetch_size = fetch_size
4747
self._on_closed = on_closed
48-
self._on_network_error = on_network_error
48+
self._on_error = on_error
4949

5050
def __enter__(self):
5151
return self
@@ -65,9 +65,9 @@ def _begin(self, database, bookmarks, access_mode, metadata, timeout):
6565
def _result_on_closed_handler(self):
6666
pass
6767

68-
def _result_on_network_error_handler(self):
68+
def _result_on_error_handler(self):
6969
self._closed = True
70-
self._on_network_error()
70+
self._on_error()
7171

7272
def _consume_results(self):
7373
for result in self._results:
@@ -111,7 +111,7 @@ def run(self, query, parameters=None, **kwparameters):
111111
raise ValueError("Query object is only supported for session.run")
112112

113113
if self._closed:
114-
raise TransactionError("Transaction closed")
114+
raise TransactionError(self, "Transaction closed")
115115

116116
if (self._results
117117
and self._connection.supports_multiple_results is False):
@@ -123,7 +123,7 @@ def run(self, query, parameters=None, **kwparameters):
123123
result = Result(
124124
self._connection, DataHydrator(), self._fetch_size,
125125
self._result_on_closed_handler,
126-
self._result_on_network_error_handler
126+
self._result_on_error_handler
127127
)
128128
self._results.append(result)
129129

@@ -137,7 +137,7 @@ def commit(self):
137137
:raise TransactionError: if the transaction is already closed
138138
"""
139139
if self._closed:
140-
raise TransactionError("Transaction closed")
140+
raise TransactionError(self, "Transaction closed")
141141
metadata = {}
142142
try:
143143
self._consume_results() # DISCARD pending records then do a commit.
@@ -157,7 +157,7 @@ def rollback(self):
157157
:raise TransactionError: if the transaction is already closed
158158
"""
159159
if self._closed:
160-
raise TransactionError("Transaction closed")
160+
raise TransactionError(self, "Transaction closed")
161161
metadata = {}
162162
try:
163163
if not self._connection.is_reset:

testkitbackend/test_config.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"skips": {
3-
"neo4j.txrun.TestTxRun.test_should_not_run_valid_query_in_invalid_tx":
4-
"Driver allows to run queries in broken transaction",
3+
"neo4j.txrun.TestTxRun.test_should_be_able_to_rollback_a_failure":
4+
"Driver does not allow to rollback a failed transaction",
55
"stub.routing.test_routing_v4x1.RoutingV4x1.test_should_retry_write_until_success_with_leader_change_using_tx_function":
66
"Driver closes connection to router if DNS resolved name not in routing table",
77
"stub.routing.test_routing_v3.RoutingV3.test_should_retry_write_until_success_with_leader_change_using_tx_function":

0 commit comments

Comments
 (0)