@@ -2003,4 +2003,146 @@ describe('Bulk', function () {
2003
2003
) ;
2004
2004
} ) ;
2005
2005
} ) ;
2006
+
2007
+ describe ( 'Bulk operation transaction rollback' , ( ) => {
2008
+ /** @type {import('../../src/index').MongoClient } */
2009
+ let client ;
2010
+ /** @type {import('../../src/index').Collection<{ answer: number }> } */
2011
+ let collection ;
2012
+
2013
+ beforeEach ( async function ( ) {
2014
+ const config = this . configuration ;
2015
+ client = config . newClient ( ) ;
2016
+ await client . connect ( ) ;
2017
+
2018
+ try {
2019
+ await client
2020
+ . db ( 'bulk_operation_writes_test' )
2021
+ . collection ( 'bulk_write_transaction_test' )
2022
+ . drop ( ) ;
2023
+ } catch ( _ ) {
2024
+ // do not care
2025
+ }
2026
+
2027
+ collection = await client
2028
+ . db ( 'bulk_operation_writes_test' )
2029
+ . createCollection ( 'bulk_write_transaction_test' ) ;
2030
+
2031
+ await collection . deleteMany ( { } ) ;
2032
+ } ) ;
2033
+
2034
+ afterEach ( async ( ) => {
2035
+ if ( client ) await client . close ( ) ;
2036
+ } ) ;
2037
+
2038
+ it ( 'should abort ordered bulk operation writes' , {
2039
+ metadata : { requires : { mongodb : '>= 4.2' , topology : [ 'replicaset' ] } } ,
2040
+ async test ( ) {
2041
+ const session = client . startSession ( ) ;
2042
+ session . startTransaction ( {
2043
+ readConcern : { level : 'local' } ,
2044
+ writeConcern : { w : 'majority' }
2045
+ } ) ;
2046
+
2047
+ let bulk = undefined ;
2048
+
2049
+ bulk = collection . initializeOrderedBulkOp ( { session } ) ;
2050
+ bulk . insert ( { answer : 42 } ) ;
2051
+ await bulk . execute ( ) ;
2052
+
2053
+ await session . abortTransaction ( ) ;
2054
+ await session . endSession ( ) ;
2055
+
2056
+ const documents = await collection . find ( ) . toArray ( ) ;
2057
+
2058
+ expect ( documents ) . to . have . lengthOf (
2059
+ 0 ,
2060
+ 'bulk operation writes were made outside of transaction'
2061
+ ) ;
2062
+ }
2063
+ } ) ;
2064
+
2065
+ it ( 'should abort unordered bulk operation writes' , {
2066
+ metadata : { requires : { mongodb : '>= 4.2' , topology : [ 'replicaset' ] } } ,
2067
+ async test ( ) {
2068
+ const session = client . startSession ( ) ;
2069
+ session . startTransaction ( {
2070
+ readConcern : { level : 'local' } ,
2071
+ writeConcern : { w : 'majority' }
2072
+ } ) ;
2073
+
2074
+ let bulk = undefined ;
2075
+
2076
+ bulk = collection . initializeUnorderedBulkOp ( { session } ) ;
2077
+ bulk . insert ( { answer : 42 } ) ;
2078
+ await bulk . execute ( ) ;
2079
+
2080
+ await session . abortTransaction ( ) ;
2081
+ await session . endSession ( ) ;
2082
+
2083
+ const documents = await collection . find ( ) . toArray ( ) ;
2084
+
2085
+ expect ( documents ) . to . have . lengthOf (
2086
+ 0 ,
2087
+ 'bulk operation writes were made outside of transaction'
2088
+ ) ;
2089
+ }
2090
+ } ) ;
2091
+
2092
+ it ( 'should abort unordered bulk operation writes using withTransaction' , {
2093
+ metadata : { requires : { mongodb : '>= 4.2' , topology : [ 'replicaset' ] } } ,
2094
+ async test ( ) {
2095
+ const session = client . startSession ( ) ;
2096
+
2097
+ await session . withTransaction (
2098
+ async ( ) => {
2099
+ let bulk = undefined ;
2100
+
2101
+ bulk = collection . initializeUnorderedBulkOp ( { session } ) ;
2102
+ bulk . insert ( { answer : 42 } ) ;
2103
+ await bulk . execute ( ) ;
2104
+ await session . abortTransaction ( ) ;
2105
+ } ,
2106
+ { readConcern : { level : 'local' } , writeConcern : { w : 'majority' } }
2107
+ ) ;
2108
+
2109
+ await session . endSession ( ) ;
2110
+
2111
+ const documents = await collection . find ( ) . toArray ( ) ;
2112
+
2113
+ expect ( documents ) . to . have . lengthOf (
2114
+ 0 ,
2115
+ 'bulk operation writes were made outside of transaction'
2116
+ ) ;
2117
+ }
2118
+ } ) ;
2119
+
2120
+ it ( 'should abort ordered bulk operation writes using withTransaction' , {
2121
+ metadata : { requires : { mongodb : '>= 4.2' , topology : [ 'replicaset' ] } } ,
2122
+ async test ( ) {
2123
+ const session = client . startSession ( ) ;
2124
+
2125
+ await session . withTransaction (
2126
+ async ( ) => {
2127
+ let bulk = undefined ;
2128
+
2129
+ bulk = collection . initializeOrderedBulkOp ( { session } ) ;
2130
+ bulk . insert ( { answer : 42 } ) ;
2131
+ await bulk . execute ( ) ;
2132
+ await session . abortTransaction ( ) ;
2133
+ } ,
2134
+ { readConcern : { level : 'local' } , writeConcern : { w : 'majority' } }
2135
+ ) ;
2136
+
2137
+ await session . endSession ( ) ;
2138
+
2139
+ const documents = await collection . find ( ) . toArray ( ) ;
2140
+
2141
+ expect ( documents ) . to . have . lengthOf (
2142
+ 0 ,
2143
+ 'bulk operation writes were made outside of transaction'
2144
+ ) ;
2145
+ }
2146
+ } ) ;
2147
+ } ) ;
2006
2148
} ) ;
0 commit comments