runOn: - minServerVersion: "4.0" topology: ["replicaset"] - minServerVersion: "4.1.8" topology: ["sharded"] database_name: &database_name "withTransaction-tests" collection_name: &collection_name "test" data: [] tests: - description: withTransaction commits after callback returns useMultipleMongoses: true operations: - name: withTransaction object: session0 arguments: callback: operations: - name: insertOne object: collection arguments: session: session0 document: { _id: 1 } result: insertedId: 1 - name: insertOne object: collection arguments: session: session0 document: { _id: 2 } result: insertedId: 2 expectations: - command_started_event: command: insert: *collection_name documents: - { _id: 1 } ordered: true lsid: session0 txnNumber: { $numberLong: "1" } startTransaction: true autocommit: false # omitted fields readConcern: ~ writeConcern: ~ command_name: insert database_name: *database_name - command_started_event: command: insert: *collection_name documents: - { _id: 2 } ordered: true lsid: session0 txnNumber: { $numberLong: "1" } autocommit: false # omitted fields readConcern: ~ startTransaction: ~ writeConcern: ~ command_name: insert database_name: *database_name - command_started_event: command: commitTransaction: 1 lsid: session0 txnNumber: { $numberLong: "1" } autocommit: false # omitted fields readConcern: ~ startTransaction: ~ writeConcern: ~ command_name: commitTransaction database_name: admin outcome: collection: data: - { _id: 1 } - { _id: 2 } - # In this scenario, the callback commits the transaction originally started # by withTransaction and starts a second transaction before returning. Since # withTransaction only examines the session's state, it should commit that # second transaction after the callback returns. description: withTransaction commits after callback returns (second transaction) useMultipleMongoses: true operations: - name: withTransaction object: session0 arguments: callback: operations: - name: insertOne object: collection arguments: session: session0 document: { _id: 1 } result: insertedId: 1 - name: commitTransaction object: session0 - name: startTransaction object: session0 - name: insertOne object: collection arguments: session: session0 document: { _id: 2 } result: insertedId: 2 expectations: - command_started_event: command: insert: *collection_name documents: - { _id: 1 } ordered: true lsid: session0 txnNumber: { $numberLong: "1" } startTransaction: true autocommit: false # omitted fields readConcern: ~ writeConcern: ~ command_name: insert database_name: *database_name - command_started_event: command: commitTransaction: 1 lsid: session0 txnNumber: { $numberLong: "1" } autocommit: false # omitted fields readConcern: ~ startTransaction: ~ writeConcern: ~ command_name: commitTransaction database_name: admin - command_started_event: command: insert: *collection_name documents: - { _id: 2 } ordered: true lsid: session0 # second transaction will be causally consistent with the first readConcern: { afterClusterTime: 42 } # txnNumber is incremented for the second transaction txnNumber: { $numberLong: "2" } startTransaction: true autocommit: false # omitted fields writeConcern: ~ command_name: insert database_name: *database_name - command_started_event: command: commitTransaction: 1 lsid: session0 txnNumber: { $numberLong: "2" } autocommit: false # omitted fields readConcern: ~ startTransaction: ~ writeConcern: ~ command_name: commitTransaction database_name: admin outcome: collection: data: - { _id: 1 } - { _id: 2 }