For a transaction, readConcern, writeConcern, and readPreferences should be inherited from the client when they aren't specified in startTransaction and aren't included in the default transaction options on the session.
In libmongoc, if a session is created with empty session options, the session won't inherit the transactions readConcern, writeConcern, and readPreferences from the client.
Compilable example:
#include <mongoc/mongoc.h> int main (int argc, char *argv[]) { mongoc_client_t *client = NULL; mongoc_client_session_t *session = NULL; mongoc_session_opt_t *session_opts = NULL; mongoc_transaction_opt_t *default_txn_opts = NULL; bson_error_t error; const mongoc_session_opt_t* returned_session_opts = NULL; const mongoc_transaction_opt_t* returned_transaction_opts = NULL; mongoc_init (); client = mongoc_client_new ("mongodb://localhost/?w=0"); /* construct session options and set an empty default transaction opts. */ session_opts = mongoc_session_opts_new (); default_txn_opts = mongoc_transaction_opts_new (); mongoc_session_opts_set_default_transaction_opts (session_opts, default_txn_opts); session = mongoc_client_start_session (client, session_opts, &error); /* the default options should be inherited from the client but aren't */ returned_session_opts = mongoc_client_session_get_opts (session); returned_transaction_opts = mongoc_session_opts_get_default_transaction_opts (returned_session_opts); BSON_ASSERT (mongoc_transaction_opts_get_write_concern (returned_transaction_opts) == NULL); /* transactions without an explicit write concern use NULL for the write concern. */ mongoc_cleanup (); return 0; }
mongoc_client_start_session overwrites the inherited transaction options by calling _mongoc_session_opts_copy after inheriting from the client.
The C++ driver sets a default empty transactions options when the user does not provide one, causing it to fail some spec tests.
- is depended on by
-
CXX-1531 Implement Transactions spec
- Closed