2 @message |
firebird.driver.types.DatabaseError: invalid transaction handle (expecting explicit transaction start)
LOG DETAILS:
2024-05-12 18:17:12.716
2024-05-12 18:17:12.721 act = <firebird.qa.plugin.Action object at [hex]>
2024-05-12 18:17:12.725 capsys = <_pytest.capture.CaptureFixture object at [hex]>
2024-05-12 18:17:12.730
2024-05-12 18:17:12.736 @pytest.mark.version('>=3')
2024-05-12 18:17:12.741 def test_1(act: Action, capsys):
2024-05-12 18:17:12.745 def check_events(seqno: int):
2024-05-12 18:17:12.750 with act.db.connect() as con:
2024-05-12 18:17:12.754 timed_event = Timer(1.0, send_events, args=[con, ["insert into test(id) values (rand()*1000)",]])
2024-05-12 18:17:12.759 with con.event_collector(['dml_event']) as events:
2024-05-12 18:17:12.764 timed_event.start()
2024-05-12 18:17:12.768 t1 = time()
2024-05-12 18:17:12.773 max4delivering = 3
2024-05-12 18:17:12.777 e = events.wait(max4delivering)
2024-05-12 18:17:12.782 t2 = time()
2024-05-12 18:17:12.787 print(e)
2024-05-12 18:17:12.792 print(f'{seqno}: event was SUCCESSFULLY delivered.' if t2-t1 < max4delivering
2024-05-12 18:17:12.797 else f'{seqno}: event was NOT delivered for {t2-t1}s (threshold is {max4delivering}s)')
2024-05-12 18:17:12.801
2024-05-12 18:17:12.806 #
2024-05-12 18:17:12.810 check_events(1)
2024-05-12 18:17:12.816 check_events(2)
2024-05-12 18:17:12.822 check_events(3)
2024-05-12 18:17:12.829 check_events(4)
2024-05-12 18:17:12.836 > check_events(5)
2024-05-12 18:17:12.842
2024-05-12 18:17:12.848 tests/bugs/core_5210_test.py:87:
2024-05-12 18:17:12.854 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2024-05-12 18:17:12.860
2024-05-12 18:17:12.866 seqno = 5
2024-05-12 18:17:12.872
2024-05-12 18:17:12.878 def check_events(seqno: int):
2024-05-12 18:17:12.885 > with act.db.connect() as con:
2024-05-12 18:17:12.891
2024-05-12 18:17:12.897 tests/bugs/core_5210_test.py:70:
2024-05-12 18:17:12.903 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2024-05-12 18:17:12.909
2024-05-12 18:17:12.915 self = Connection[1579], exc_type = None, exc_value = None, traceback = None
2024-05-12 18:17:12.921
2024-05-12 18:17:12.927 def __exit__(self, exc_type, exc_value, traceback) -> None:
2024-05-12 18:17:12.933 > self.close()
2024-05-12 18:17:12.939
2024-05-12 18:17:12.946 ../lib/python3.11/site-packages/firebird/driver/core.py:1666:
2024-05-12 18:17:12.952 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2024-05-12 18:17:12.958
2024-05-12 18:17:12.964 self = Connection[1579]
2024-05-12 18:17:12.969
2024-05-12 18:17:12.975 def close(self) -> None:
2024-05-12 18:17:12.981 """Close the connection and release all associated resources.
2024-05-12 18:17:12.988
2024-05-12 18:17:12.995 Closes all event collectors, transaction managers (with rollback) and statements
2024-05-12 18:17:13.002 associated with this connection before attempt (see Hooks) to close the
2024-05-12 18:17:13.007 connection itself.
2024-05-12 18:17:13.013
2024-05-12 18:17:13.018 Hooks:
2024-05-12 18:17:13.022 Event `.ConnectionHook.DETACH_REQUEST`: Executed before connection
2024-05-12 18:17:13.028 is closed. Hook must have signature::
2024-05-12 18:17:13.033
2024-05-12 18:17:13.038 hook_func(connection: Connection) -> bool
2024-05-12 18:17:13.043
2024-05-12 18:17:13.047 .. note::
2024-05-12 18:17:13.052
2024-05-12 18:17:13.057 If any hook function returns True, connection is NOT closed.
2024-05-12 18:17:13.062
2024-05-12 18:17:13.067 Event `.ConnectionHook.CLOSED`: Executed after connection is closed.
2024-05-12 18:17:13.072 Hook must have signature::
2024-05-12 18:17:13.077
2024-05-12 18:17:13.082 hook_func(connection: Connection) -> None
2024-05-12 18:17:13.087
2024-05-12 18:17:13.092 Any value returned by hook is ignored.
2024-05-12 18:17:13.097
2024-05-12 18:17:13.102 Important:
2024-05-12 18:17:13.107 Closed connection SHALL NOT be used anymore.
2024-05-12 18:17:13.111 """
2024-05-12 18:17:13.116 if not self.is_closed():
2024-05-12 18:17:13.121 retain = False
2024-05-12 18:17:13.125 try:
2024-05-12 18:17:13.130 > self._close()
2024-05-12 18:17:13.135
2024-05-12 18:17:13.140 ../lib/python3.11/site-packages/firebird/driver/core.py:1854:
2024-05-12 18:17:13.145 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2024-05-12 18:17:13.149
2024-05-12 18:17:13.154 self = Connection[1579]
2024-05-12 18:17:13.159
2024-05-12 18:17:13.164 def _close(self) -> None:
2024-05-12 18:17:13.170 if self.__schema is not None:
2024-05-12 18:17:13.175 self.__schema._set_internal(False)
2024-05-12 18:17:13.180 self.__schema.close()
2024-05-12 18:17:13.184 if self.__monitor is not None:
2024-05-12 18:17:13.189 self.__monitor._set_internal(False)
2024-05-12 18:17:13.194 self.__monitor.close()
2024-05-12 18:17:13.198 self._ic.close()
2024-05-12 18:17:13.203 for collector in self.__ecollectors:
2024-05-12 18:17:13.208 collector.close()
2024-05-12 18:17:13.212 > self.main_transaction._finish(DefaultAction.ROLLBACK)
2024-05-12 18:17:13.217
2024-05-12 18:17:13.222 ../lib/python3.11/site-packages/firebird/driver/core.py:1691:
2024-05-12 18:17:13.227 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2024-05-12 18:17:13.231
2024-05-12 18:17:13.236 self = <firebird.driver.core.TransactionManager object at [hex]>
2024-05-12 18:17:13.240 default_action = <DefaultAction.ROLLBACK: 2>
2024-05-12 18:17:13.245
2024-05-12 18:17:13.250 def _finish(self, default_action: DefaultAction=None) -> None:
2024-05-12 18:17:13.254 try:
2024-05-12 18:17:13.259 if self._tra is not None:
2024-05-12 18:17:13.264 if default_action is None:
2024-05-12 18:17:13.268 default_action = self.default_action
2024-05-12 18:17:13.273 if default_action == DefaultAction.COMMIT:
2024-05-12 18:17:13.277 self.commit()
2024-05-12 18:17:13.282 else:
2024-05-12 18:17:13.287 > self.rollback()
2024-05-12 18:17:13.292
2024-05-12 18:17:13.296 ../lib/python3.11/site-packages/firebird/driver/core.py:2399:
2024-05-12 18:17:13.301 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2024-05-12 18:17:13.305
2024-05-12 18:17:13.310 self = <firebird.driver.core.TransactionManager object at [hex]>
2024-05-12 18:17:13.315
2024-05-12 18:17:13.320 def rollback(self, *, retaining: bool=False, savepoint: str=None) -> None:
2024-05-12 18:17:13.324 """Rolls back the transaction managed by this instance.
2024-05-12 18:17:13.329
2024-05-12 18:17:13.333 Arguments:
2024-05-12 18:17:13.339 retaining: When True, the transaction context is retained after rollback.
2024-05-12 18:17:13.344 savepoint: When specified, the transaction is rolled back to savepoint with given name.
2024-05-12 18:17:13.348
2024-05-12 18:17:13.353 Raises:
2024-05-12 18:17:13.358 InterfaceError: When both retaining and savepoint parameters are specified.
2024-05-12 18:17:13.362 """
2024-05-12 18:17:13.366 assert not self.__closed
2024-05-12 18:17:13.371 assert self.is_active()
2024-05-12 18:17:13.376 if retaining and savepoint:
2024-05-12 18:17:13.380 raise InterfaceError("Can't rollback to savepoint while retaining context")
2024-05-12 18:17:13.385 if savepoint:
2024-05-12 18:17:13.389 self.execute_immediate(f'rollback to {savepoint}')
2024-05-12 18:17:13.394 else:
2024-05-12 18:17:13.398 if retaining:
2024-05-12 18:17:13.403 self._tra.rollback_retaining()
2024-05-12 18:17:13.408 else:
2024-05-12 18:17:13.413 self._close_cursors()
2024-05-12 18:17:13.418 > self._tra.rollback()
2024-05-12 18:17:13.422
2024-05-12 18:17:13.427 ../lib/python3.11/site-packages/firebird/driver/core.py:2487:
2024-05-12 18:17:13.432 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2024-05-12 18:17:13.437
2024-05-12 18:17:13.441 self = <firebird.driver.interfaces.iTransaction_v3 object at [hex]>
2024-05-12 18:17:13.446
2024-05-12 18:17:13.451 def rollback(self) -> None:
2024-05-12 18:17:13.455 "Replaces `isc_rollback_transaction()`"
2024-05-12 18:17:13.460 self.vtable.deprecatedRollback(self, self.status)
2024-05-12 18:17:13.464 > self._check()
2024-05-12 18:17:13.469
2024-05-12 18:17:13.474 ../lib/python3.11/site-packages/firebird/driver/interfaces.py:438:
2024-05-12 18:17:13.479 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2024-05-12 18:17:13.484
2024-05-12 18:17:13.489 self = <firebird.driver.interfaces.iTransaction_v3 object at [hex]>
2024-05-12 18:17:13.494
2024-05-12 18:17:13.499 def _check(self) -> None:
2024-05-12 18:17:13.504 state = self.status.get_state()
2024-05-12 18:17:13.509 if StateFlag.ERRORS in state:
2024-05-12 18:17:13.514 > raise self.__report(DatabaseError, self.status.get_errors())
2024-05-12 18:17:13.519 E firebird.driver.types.DatabaseError: invalid transaction handle (expecting explicit transaction start)
2024-05-12 18:17:13.524
2024-05-12 18:17:13.529 ../lib/python3.11/site-packages/firebird/driver/interfaces.py:113: DatabaseError
2024-05-12 18:17:13.533 ---------------------------- Captured stdout setup -----------------------------
2024-05-12 18:17:13.538 Cached db: db-12.0-None-None-NONE.fdb [page_size=None, sql_dialect=None, charset='NONE'
2024-05-12 18:17:13.543 ----------------------------- Captured stdout call -----------------------------
2024-05-12 18:17:13.548 {'dml_event': 1}
2024-05-12 18:17:13.552 1: event was SUCCESSFULLY delivered.
2024-05-12 18:17:13.558 {'dml_event': 1}
2024-05-12 18:17:13.564 2: event was SUCCESSFULLY delivered.
2024-05-12 18:17:13.570 {'dml_event': 1}
2024-05-12 18:17:13.575 3: event was SUCCESSFULLY delivered.
2024-05-12 18:17:13.580 {'dml_event': 1}
2024-05-12 18:17:13.585 4: event was SUCCESSFULLY delivered.
2024-05-12 18:17:13.589 {'dml_event': 1}
2024-05-12 18:17:13.594 5: event was SUCCESSFULLY delivered.
|
3 #text |
act = <firebird.qa.plugin.Action pytest object at [hex]>
capsys = <_pytest.capture.CaptureFixture pytest object at [hex]>
@pytest.mark.version('>=3')
def test_1(act: Action, capsys):
def check_events(seqno: int):
with act.db.connect() as con:
timed_event = Timer(1.0, send_events, args=[con, ["insert into test(id) values (rand()*1000)",]])
with con.event_collector(['dml_event']) as events:
timed_event.start()
t1 = time()
max4delivering = 3
e = events.wait(max4delivering)
t2 = time()
print(e)
print(f'{seqno}: event was SUCCESSFULLY delivered.' if t2-t1 < max4delivering
else f'{seqno}: event was NOT delivered for {t2-t1}s (threshold is {max4delivering}s)')
#
check_events(1)
check_events(2)
check_events(3)
check_events(4)
> check_events(5)
tests/bugs/core_5210_test.py:87:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
seqno = 5
def check_events(seqno: int):
> with act.db.connect() as con:
tests/bugs/core_5210_test.py:70:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = Connection[1579], exc_type = None, exc_value = None, traceback = None
def __exit__(self, exc_type, exc_value, traceback) -> None:
> self.close()
../lib/python3.11/site-packages/firebird/driver/core.py:1666:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = Connection[1579]
def close(self) -> None:
"""Close the connection and release all associated resources.
Closes all event collectors, transaction managers (with rollback) and statements
associated with this connection before attempt (see Hooks) to close the
connection itself.
Hooks:
Event `.ConnectionHook.DETACH_REQUEST`: Executed before connection
is closed. Hook must have signature::
hook_func(connection: Connection) -> bool
.. note::
If any hook function returns True, connection is NOT closed.
Event `.ConnectionHook.CLOSED`: Executed after connection is closed.
Hook must have signature::
hook_func(connection: Connection) -> None
Any value returned by hook is ignored.
Important:
Closed connection SHALL NOT be used anymore.
"""
if not self.is_closed():
retain = False
try:
> self._close()
../lib/python3.11/site-packages/firebird/driver/core.py:1854:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = Connection[1579]
def _close(self) -> None:
if self.__schema is not None:
self.__schema._set_internal(False)
self.__schema.close()
if self.__monitor is not None:
self.__monitor._set_internal(False)
self.__monitor.close()
self._ic.close()
for collector in self.__ecollectors:
collector.close()
> self.main_transaction._finish(DefaultAction.ROLLBACK)
../lib/python3.11/site-packages/firebird/driver/core.py:1691:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <firebird.driver.core.TransactionManager pytest object at [hex]>
default_action = <DefaultAction.ROLLBACK: 2>
def _finish(self, default_action: DefaultAction=None) -> None:
try:
if self._tra is not None:
if default_action is None:
default_action = self.default_action
if default_action == DefaultAction.COMMIT:
self.commit()
else:
> self.rollback()
../lib/python3.11/site-packages/firebird/driver/core.py:2399:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <firebird.driver.core.TransactionManager pytest object at [hex]>
def rollback(self, *, retaining: bool=False, savepoint: str=None) -> None:
"""Rolls back the transaction managed by this instance.
Arguments:
retaining: When True, the transaction context is retained after rollback.
savepoint: When specified, the transaction is rolled back to savepoint with given name.
Raises:
InterfaceError: When both retaining and savepoint parameters are specified.
"""
assert not self.__closed
assert self.is_active()
if retaining and savepoint:
raise InterfaceError("Can't rollback to savepoint while retaining context")
if savepoint:
self.execute_immediate(f'rollback to {savepoint}')
else:
if retaining:
self._tra.rollback_retaining()
else:
self._close_cursors()
> self._tra.rollback()
../lib/python3.11/site-packages/firebird/driver/core.py:2487:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <firebird.driver.interfaces.iTransaction_v3 pytest object at [hex]>
def rollback(self) -> None:
"Replaces `isc_rollback_transaction()`"
self.vtable.deprecatedRollback(self, self.status)
> self._check()
../lib/python3.11/site-packages/firebird/driver/interfaces.py:438:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <firebird.driver.interfaces.iTransaction_v3 pytest object at [hex]>
def _check(self) -> None:
state = self.status.get_state()
if StateFlag.ERRORS in state:
> raise self.__report(DatabaseError, self.status.get_errors())
E firebird.driver.types.DatabaseError: invalid transaction handle (expecting explicit transaction start)
../lib/python3.11/site-packages/firebird/driver/interfaces.py:113: DatabaseError
|