Skip to content

Commit d84a9d9

Browse files
p7novpatiencedaur
andauthored
Add iproto requests for stream transactions (#2918)
Resolves #2402 #2922 Co-authored-by: Dia Patience Daur <[email protected]>
1 parent 3354324 commit d84a9d9

File tree

1 file changed

+106
-12
lines changed

1 file changed

+106
-12
lines changed

doc/dev_guide/internals/box_protocol.rst

Lines changed: 106 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,8 @@ The IPROTO constants that appear within requests or responses that we will descr
143143
IPROTO_RAFT_VCLOCK=0x03
144144
IPROTO_VERSION=0x54
145145
IPROTO_FEATURES=0x55
146+
IPROTO_TIMEOUT=0x56
147+
IPROTO_TXN_ISOLATION = 0x59
146148
147149
148150
To denote message descriptions we will say ``msgpack(...)`` and within it we will use modified
@@ -706,6 +708,96 @@ IPROTO_SQL_TEXT (0x40) and statement-text (string) if executing an SQL string.
706708
Thus the IPROTO_PREPARE map item is the same as the first item of the
707709
:ref:`IPROTO_EXECUTE <box_protocol-execute>` body.
708710

711+
.. _box_protocol-begin:
712+
713+
IPROTO_BEGIN = 0x0e
714+
~~~~~~~~~~~~~~~~~~~~~
715+
716+
Begin a transaction in the specified stream.
717+
See :ref:`stream:begin() <net_box-stream_begin>`.
718+
The body is optional and can contain two items:
719+
720+
.. cssclass:: highlight
721+
.. parsed-literal::
722+
723+
# <size>
724+
msgpack(:samp:`{{MP_UINT unsigned integer = size(<header>) + size(<body>)}}`)
725+
# <header>
726+
msgpack({
727+
IPROTO_REQUEST_TYPE: IPROTO_BEGIN,
728+
IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`,
729+
IPROTO_STREAM_ID: :samp:`{{MP_UINT unsigned integer}}`
730+
})
731+
# <body>
732+
msgpack({
733+
IPROTO_TIMEOUT: :samp:`{{MP_DOUBLE}}`,
734+
IPROTO_TXN_ISOLATION: :samp:`{{MP_UINT unsigned integer}}`
735+
})
736+
737+
IPROTO_TIMEOUT is an optional timeout (in seconds). After it expires,
738+
the transaction will be rolled back automatically.
739+
740+
.. // TODO: add link to transaction isolation docs once they're ready
741+
IPROTO_TXN_ISOLATION is the transaction isolation level. It can take
742+
the following values:
743+
744+
.. // TODO: provide links to level descriptions
745+
- ``TXN_ISOLATION_DEFAULT = 0`` -- use the global default level (default value)
746+
- ``TXN_ISOLATION_READ_COMMITTED = 1`` -- read changes that are committed but not confirmed yet
747+
- ``TXN_ISOLATION_READ_CONFIRMED = 2`` -- read confirmed changes
748+
- ``TXN_ISOLATION_BEST_EFFORT = 3`` -- determine isolation level automatically
749+
750+
See :ref:`Binary protocol -- streams <box_protocol-streams>` to learn more about
751+
stream transactions in the binary protocol.
752+
753+
754+
.. _box_protocol-commit:
755+
756+
IPROTO_COMMIT = 0x0f
757+
~~~~~~~~~~~~~~~~~~~~~
758+
759+
Commit the transaction in the specified stream.
760+
See :ref:`stream:commit() <net_box-stream_commit>`.
761+
762+
.. cssclass:: highlight
763+
.. parsed-literal::
764+
765+
# <size>
766+
msgpack(7)
767+
# <header>
768+
msgpack({
769+
IPROTO_REQUEST_TYPE: IPROTO_COMMIT,
770+
IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`,
771+
IPROTO_STREAM_ID: :samp:`{{MP_UINT unsigned integer}}`
772+
})
773+
774+
See :ref:`Binary protocol -- streams <box_protocol-streams>` to learn more about
775+
stream transactions in the binary protocol.
776+
777+
778+
.. _box_protocol-rollback:
779+
780+
IPROTO_ROLLBACK = 0x10
781+
~~~~~~~~~~~~~~~~~~~~~
782+
783+
Rollback the transaction in the specified stream.
784+
See :ref:`stream:rollback() <net_box-stream_rollback>`.
785+
786+
.. cssclass:: highlight
787+
.. parsed-literal::
788+
789+
# <size>
790+
msgpack(7)
791+
# <header>
792+
msgpack({
793+
IPROTO_REQUEST_TYPE: IPROTO_ROLLBACK,
794+
IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`,
795+
IPROTO_STREAM_ID: :samp:`{{MP_UINT unsigned integer}}`
796+
})
797+
798+
See :ref:`Binary protocol -- streams <box_protocol-streams>` to learn more about
799+
stream transactions in the binary protocol.
800+
709801

710802
.. _box_protocol-ping:
711803

@@ -746,9 +838,9 @@ Tarantool nodes in :ref:`synchronous replication <repl_sync>`.
746838
The messages are not supposed to be used by any client applications in their
747839
regular connections.
748840

749-
.. _box_protocol-confirm:
841+
.. _box_protocol-raft_confirm:
750842

751-
IPROTO_CONFIRM = 0x28
843+
IPROTO_RAFT_CONFIRM = 0x28
752844
~~~~~~~~~~~~~~~~~~~~~
753845

754846
This message confirms that the transactions originated from the instance
@@ -775,9 +867,9 @@ The body is a 2-item map:
775867
})
776868
777869
778-
.. _box_protocol-rollback:
870+
.. _box_protocol-raft_rollback:
779871

780-
IPROTO_ROLLBACK = 0x29
872+
IPROTO_RAFT_ROLLBACK = 0x29
781873
~~~~~~~~~~~~~~~~~~~~~~
782874

783875
This message says that the transactions originated from the instance
@@ -1281,16 +1373,18 @@ each call to conn:new_stream() assigns a new number, starting with 1.
12811373
.. _box_protocol-stream_transactions:
12821374

12831375
The client makes stream transactions by sending, in order:
1284-
IPROTO_BEGIN, the transaction data-change and query requests,
1285-
IPROTO_COMMIT or IPROTO_ROLLBACK.
1286-
Each request must contain the same IPROTO_STREAM_ID value.
1287-
With streaming there is no need to add
1288-
:ref:`IPROTO_FLAGS <box_protocol-flags>` and IPROTO_FLAG_COMMIT
1289-
in the header of the last request of a transaction.
1290-
Rollback will be automatic if disconnect occurs before commit is possible.
1376+
1377+
1. IPROTO_BEGIN with an optional transaction timeout in the IPROTO_TIMEOUT field of the request body.
1378+
2. The transaction data-change and query requests.
1379+
3. IPROTO_COMMIT or IPROTO_ROLLBACK.
1380+
1381+
All these requests must contain the same IPROTO_STREAM_ID value.
1382+
1383+
A rollback will happen automatically if
1384+
a disconnect occurs or the transaction timeout expires before the commit is possible.
12911385

12921386
Thus there are now multiple ways to do transactions:
1293-
with net_box and stream:begin() and stream:commit() or stream:rollback()
1387+
with ``net_box`` ``stream:begin()`` and ``stream:commit()`` or ``stream:rollback()``
12941388
which cause IPROTO_BEGIN and IPROTO_COMMIT or IPROTO_ROLLBACK with
12951389
the current value of stream.stream_id;
12961390
with :ref:`box.begin() <box-begin>` and :ref:`box.commit() <box-commit>` or :ref:`box.rollback() <box-rollback>`;

0 commit comments

Comments
 (0)