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: - # Session state will be COMMITTED when callback returns to withTransaction description: withTransaction succeeds if callback commits 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 - name: commitTransaction object: session0 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 } - # Session state will be NO_TXN when callback returns to withTransaction description: withTransaction still succeeds if callback commits and runs extra op 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 - name: commitTransaction object: session0 - name: insertOne object: collection arguments: session: session0 document: { _id: 3 } result: insertedId: 3 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 - command_started_event: command: # This test is agnostic about retryWrites, so we do not assert the # txnNumber. If retryWrites=true, the txnNumber will be incremented # from the value used in the previous transaction; otherwise, the # field will not be present at all. insert: *collection_name documents: - { _id: 3 } ordered: true lsid: session0 # omitted fields autocommit: ~ readConcern: ~ startTransaction: ~ writeConcern: ~ command_name: insert database_name: *database_name outcome: collection: data: - { _id: 1 } - { _id: 2 } - { _id: 3 }