Batch transaction (#5849)
* Batch transaction boilerplate * Refactoring transaction boilerplate * Independent sessions test * Transactions - partial * Missing only one test * All tests passing for mongo db * Tests on Travis * Transactions on postgres * Fix travis to restart mongodb * Remove mongodb service and keep only mongodb runner * MongoDB service back * Initialize replicaset * Remove mongodb runner again * Again only with mongodb-runner and removing cache * Trying with pretest and posttest * WiredTiger * Pretest and posttest again * Removing inexistent scripts * wiredTiger * One more attempt * Trying another way to run mongodb-runner * Fixing tests * Include batch transaction on direct access * Add tests to direct access
This commit is contained in:
committed by
GitHub
parent
fe18fe0f61
commit
8b97c1380b
@@ -472,7 +472,12 @@ export class MongoStorageAdapter implements StorageAdapter {
|
||||
// TODO: As yet not particularly well specified. Creates an object. Maybe shouldn't even need the schema,
|
||||
// and should infer from the type. Or maybe does need the schema for validations. Or maybe needs
|
||||
// the schema only for the legacy mongo format. We'll figure that out later.
|
||||
createObject(className: string, schema: SchemaType, object: any) {
|
||||
createObject(
|
||||
className: string,
|
||||
schema: SchemaType,
|
||||
object: any,
|
||||
transactionalSession: ?any
|
||||
) {
|
||||
schema = convertParseSchemaToMongoSchema(schema);
|
||||
const mongoObject = parseObjectToMongoObjectForCreate(
|
||||
className,
|
||||
@@ -480,7 +485,9 @@ export class MongoStorageAdapter implements StorageAdapter {
|
||||
schema
|
||||
);
|
||||
return this._adaptiveCollection(className)
|
||||
.then(collection => collection.insertOne(mongoObject))
|
||||
.then(collection =>
|
||||
collection.insertOne(mongoObject, transactionalSession)
|
||||
)
|
||||
.catch(error => {
|
||||
if (error.code === 11000) {
|
||||
// Duplicate value
|
||||
@@ -510,13 +517,14 @@ export class MongoStorageAdapter implements StorageAdapter {
|
||||
deleteObjectsByQuery(
|
||||
className: string,
|
||||
schema: SchemaType,
|
||||
query: QueryType
|
||||
query: QueryType,
|
||||
transactionalSession: ?any
|
||||
) {
|
||||
schema = convertParseSchemaToMongoSchema(schema);
|
||||
return this._adaptiveCollection(className)
|
||||
.then(collection => {
|
||||
const mongoWhere = transformWhere(className, query, schema);
|
||||
return collection.deleteMany(mongoWhere);
|
||||
return collection.deleteMany(mongoWhere, transactionalSession);
|
||||
})
|
||||
.catch(err => this.handleError(err))
|
||||
.then(
|
||||
@@ -543,13 +551,16 @@ export class MongoStorageAdapter implements StorageAdapter {
|
||||
className: string,
|
||||
schema: SchemaType,
|
||||
query: QueryType,
|
||||
update: any
|
||||
update: any,
|
||||
transactionalSession: ?any
|
||||
) {
|
||||
schema = convertParseSchemaToMongoSchema(schema);
|
||||
const mongoUpdate = transformUpdate(className, update, schema);
|
||||
const mongoWhere = transformWhere(className, query, schema);
|
||||
return this._adaptiveCollection(className)
|
||||
.then(collection => collection.updateMany(mongoWhere, mongoUpdate))
|
||||
.then(collection =>
|
||||
collection.updateMany(mongoWhere, mongoUpdate, transactionalSession)
|
||||
)
|
||||
.catch(err => this.handleError(err));
|
||||
}
|
||||
|
||||
@@ -559,7 +570,8 @@ export class MongoStorageAdapter implements StorageAdapter {
|
||||
className: string,
|
||||
schema: SchemaType,
|
||||
query: QueryType,
|
||||
update: any
|
||||
update: any,
|
||||
transactionalSession: ?any
|
||||
) {
|
||||
schema = convertParseSchemaToMongoSchema(schema);
|
||||
const mongoUpdate = transformUpdate(className, update, schema);
|
||||
@@ -568,6 +580,7 @@ export class MongoStorageAdapter implements StorageAdapter {
|
||||
.then(collection =>
|
||||
collection._mongoCollection.findOneAndUpdate(mongoWhere, mongoUpdate, {
|
||||
returnOriginal: false,
|
||||
session: transactionalSession || undefined,
|
||||
})
|
||||
)
|
||||
.then(result => mongoObjectToParseObject(className, result.value, schema))
|
||||
@@ -588,13 +601,16 @@ export class MongoStorageAdapter implements StorageAdapter {
|
||||
className: string,
|
||||
schema: SchemaType,
|
||||
query: QueryType,
|
||||
update: any
|
||||
update: any,
|
||||
transactionalSession: ?any
|
||||
) {
|
||||
schema = convertParseSchemaToMongoSchema(schema);
|
||||
const mongoUpdate = transformUpdate(className, update, schema);
|
||||
const mongoWhere = transformWhere(className, query, schema);
|
||||
return this._adaptiveCollection(className)
|
||||
.then(collection => collection.upsertOne(mongoWhere, mongoUpdate))
|
||||
.then(collection =>
|
||||
collection.upsertOne(mongoWhere, mongoUpdate, transactionalSession)
|
||||
)
|
||||
.catch(err => this.handleError(err));
|
||||
}
|
||||
|
||||
@@ -1059,6 +1075,24 @@ export class MongoStorageAdapter implements StorageAdapter {
|
||||
})
|
||||
.catch(err => this.handleError(err));
|
||||
}
|
||||
|
||||
createTransactionalSession(): Promise<any> {
|
||||
const transactionalSection = this.client.startSession();
|
||||
transactionalSection.startTransaction();
|
||||
return Promise.resolve(transactionalSection);
|
||||
}
|
||||
|
||||
commitTransactionalSession(transactionalSection: any): Promise<void> {
|
||||
return transactionalSection.commitTransaction().then(() => {
|
||||
transactionalSection.endSession();
|
||||
});
|
||||
}
|
||||
|
||||
abortTransactionalSession(transactionalSection: any): Promise<void> {
|
||||
return transactionalSection.abortTransaction().then(() => {
|
||||
transactionalSection.endSession();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export default MongoStorageAdapter;
|
||||
|
||||
Reference in New Issue
Block a user