From 4ea160506e7e52458d9b9186e004bcade5205fda Mon Sep 17 00:00:00 2001 From: Lucian Buzzo Date: Mon, 30 Oct 2023 10:31:08 +0000 Subject: [PATCH] feat: Add support for nested transaction rollbacks in SQL databases This change adds support for handling rollbacks in nested transactions in SQL databases. Specifically, the inner transaction should be rolled back if the outer transaction fails. To do this we keep track of the transaction ID and transaction depth so we can re-use an existing open transaction in the underlying engine. This change also allows the use of the `$transaction` method on an interactive transaction client. depends-on: https://github.com/prisma/prisma-engines/pull/4375 --- packages/adapter-d1/src/d1.ts | 8 +- packages/adapter-libsql/src/libsql.ts | 9 +++ packages/adapter-neon/src/neon.ts | 7 ++ packages/adapter-pg-worker/src/pg.ts | 7 ++ packages/adapter-pg/src/pg.ts | 7 ++ .../adapter-planetscale/src/planetscale.ts | 7 ++ packages/client/package.json | 6 +- packages/client/src/runtime/RequestHandler.ts | 8 ++ .../core/engines/binary/BinaryEngine.ts | 1 + .../core/engines/common/types/Transaction.ts | 1 + .../engines/data-proxy/DataProxyEngine.ts | 1 + .../core/engines/library/LibraryEngine.ts | 1 + .../core/types/exported/itxClientDenyList.ts | 2 +- .../client/src/runtime/getPrismaClient.ts | 9 ++- .../functional/extensions/defineExtension.ts | 1 - .../client/tests/functional/extensions/itx.ts | 2 +- .../interactive-transactions/tests.ts | 69 ++++++++++++++++- packages/driver-adapter-utils/src/binder.ts | 1 + packages/driver-adapter-utils/src/types.ts | 4 + packages/engines/package.json | 4 +- packages/fetch-engine/package.json | 4 +- packages/instrumentation/package.json | 2 +- packages/internals/package.json | 4 +- packages/migrate/package.json | 4 +- packages/schema-files-loader/package.json | 4 +- pnpm-lock.yaml | 76 ++++++------------- 26 files changed, 176 insertions(+), 73 deletions(-) diff --git a/packages/adapter-d1/src/d1.ts b/packages/adapter-d1/src/d1.ts index 47e557793bf9..ba40bb27b3af 100644 --- a/packages/adapter-d1/src/d1.ts +++ b/packages/adapter-d1/src/d1.ts @@ -31,7 +31,7 @@ class D1Queryable implements Queryable { readonly provider = 'sqlite' readonly adapterName = packageName - constructor(protected readonly client: ClientT) {} + constructor(protected readonly client: ClientT) { } /** * Execute a query given as SQL, interpolating the given parameters. @@ -117,6 +117,12 @@ class D1Transaction extends D1Queryable implements Transaction { super(client) } + async begin(): Promise> { + debug(`[js::begin]`) + + return ok(undefined) + } + async commit(): Promise> { debug(`[js::commit]`) diff --git a/packages/adapter-libsql/src/libsql.ts b/packages/adapter-libsql/src/libsql.ts index ec172c82ab07..41ca8b43ad74 100644 --- a/packages/adapter-libsql/src/libsql.ts +++ b/packages/adapter-libsql/src/libsql.ts @@ -100,6 +100,15 @@ class LibSqlTransaction extends LibSqlQueryable implements Tr super(client) } + // eslint-disable-next-line @typescript-eslint/require-await + async begin(): Promise> { + debug(`[js::commit]`) + + throw new Error('Method not implemented.') + + return ok(undefined) + } + async commit(): Promise> { debug(`[js::commit]`) diff --git a/packages/adapter-neon/src/neon.ts b/packages/adapter-neon/src/neon.ts index 6df1a01055d6..59448efdd629 100644 --- a/packages/adapter-neon/src/neon.ts +++ b/packages/adapter-neon/src/neon.ts @@ -154,6 +154,13 @@ class NeonTransaction extends NeonWsQueryable implements Transa super(client) } + async begin(): Promise> { + debug(`[js::begin]`) + + this.client.release() + return Promise.resolve(ok(undefined)) + } + async commit(): Promise> { debug(`[js::commit]`) diff --git a/packages/adapter-pg-worker/src/pg.ts b/packages/adapter-pg-worker/src/pg.ts index 49ea314cad33..d6610c91a604 100644 --- a/packages/adapter-pg-worker/src/pg.ts +++ b/packages/adapter-pg-worker/src/pg.ts @@ -143,6 +143,13 @@ class PgTransaction extends PgQueryable implements Transactio super(client) } + async begin(): Promise> { + debug(`[js::begin]`) + + this.client.release() + return ok(undefined) + } + async commit(): Promise> { debug(`[js::commit]`) diff --git a/packages/adapter-pg/src/pg.ts b/packages/adapter-pg/src/pg.ts index 2244de70b769..c5c5001419fe 100644 --- a/packages/adapter-pg/src/pg.ts +++ b/packages/adapter-pg/src/pg.ts @@ -145,6 +145,13 @@ class PgTransaction extends PgQueryable implements Transactio super(client) } + async begin(): Promise> { + debug(`[js::begin]`) + + this.client.release() + return ok(undefined) + } + async commit(): Promise> { debug(`[js::commit]`) diff --git a/packages/adapter-planetscale/src/planetscale.ts b/packages/adapter-planetscale/src/planetscale.ts index 29a0dddb0a4a..1ab33081f649 100644 --- a/packages/adapter-planetscale/src/planetscale.ts +++ b/packages/adapter-planetscale/src/planetscale.ts @@ -131,6 +131,13 @@ class PlanetScaleTransaction extends PlanetScaleQueryable> { + debug(`[js::begin]`) + + this.txDeferred.resolve() + return Promise.resolve(ok(await this.txResultPromise)) + } + async commit(): Promise> { debug(`[js::commit]`) diff --git a/packages/client/package.json b/packages/client/package.json index 30d739d552cb..0a33da74956c 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -199,7 +199,7 @@ "@prisma/debug": "workspace:*", "@prisma/driver-adapter-utils": "workspace:*", "@prisma/engines": "workspace:*", - "@prisma/engines-version": "6.2.0-14.4123509d24aa4dede1e864b46351bf2790323b69", + "@prisma/engines-version": "6.2.0-13.integration-sql-nested-transactions4-fa6eebbccfd5b45ef639efcb0fe328c189735aa4", "@prisma/fetch-engine": "workspace:*", "@prisma/generator-helper": "workspace:*", "@prisma/get-platform": "workspace:*", @@ -208,7 +208,7 @@ "@prisma/migrate": "workspace:*", "@prisma/mini-proxy": "0.9.5", "@prisma/pg-worker": "workspace:*", - "@prisma/query-engine-wasm": "6.2.0-14.4123509d24aa4dede1e864b46351bf2790323b69", + "@prisma/query-engine-wasm": "6.2.0-13.integration-sql-nested-transactions4-fa6eebbccfd5b45ef639efcb0fe328c189735aa4", "@snaplet/copycat": "0.17.3", "@swc-node/register": "1.10.9", "@swc/core": "1.10.1", @@ -278,4 +278,4 @@ } }, "sideEffects": false -} +} \ No newline at end of file diff --git a/packages/client/src/runtime/RequestHandler.ts b/packages/client/src/runtime/RequestHandler.ts index 51b36791c753..f0354bbe7c3d 100644 --- a/packages/client/src/runtime/RequestHandler.ts +++ b/packages/client/src/runtime/RequestHandler.ts @@ -109,6 +109,14 @@ export class RequestHandler { const interactiveTransaction = request.transaction?.kind === 'itx' ? getItxTransactionOptions(request.transaction) : undefined + if (interactiveTransaction) { + interactiveTransaction.payload = { + // If the interactive transaction has a payload, we need to merge it with the new_tx_id + ...(interactiveTransaction.payload as any), + new_tx_id: interactiveTransaction?.id, + } + } + const response = await this.client._engine.request(request.protocolQuery, { traceparent: this.client._tracingHelper.getTraceParent(), interactiveTransaction, diff --git a/packages/client/src/runtime/core/engines/binary/BinaryEngine.ts b/packages/client/src/runtime/core/engines/binary/BinaryEngine.ts index 14ace72c7741..8d1a5868619d 100644 --- a/packages/client/src/runtime/core/engines/binary/BinaryEngine.ts +++ b/packages/client/src/runtime/core/engines/binary/BinaryEngine.ts @@ -792,6 +792,7 @@ You very likely have the wrong "binaryTarget" defined in the schema.prisma file. max_wait: arg.maxWait, timeout: arg.timeout, isolation_level: arg.isolationLevel, + new_tx_id: arg?.newTxId, }) const result = await Connection.onHttpError( diff --git a/packages/client/src/runtime/core/engines/common/types/Transaction.ts b/packages/client/src/runtime/core/engines/common/types/Transaction.ts index 87458775cd90..de75f97a7889 100644 --- a/packages/client/src/runtime/core/engines/common/types/Transaction.ts +++ b/packages/client/src/runtime/core/engines/common/types/Transaction.ts @@ -10,6 +10,7 @@ export type Options = { maxWait?: number timeout?: number isolationLevel?: IsolationLevel + newTxId?: string } export type InteractiveTransactionInfo = { diff --git a/packages/client/src/runtime/core/engines/data-proxy/DataProxyEngine.ts b/packages/client/src/runtime/core/engines/data-proxy/DataProxyEngine.ts index a2279c928633..1396ac91ef99 100644 --- a/packages/client/src/runtime/core/engines/data-proxy/DataProxyEngine.ts +++ b/packages/client/src/runtime/core/engines/data-proxy/DataProxyEngine.ts @@ -443,6 +443,7 @@ export class DataProxyEngine implements Engine { max_wait: arg.maxWait, timeout: arg.timeout, isolation_level: arg.isolationLevel, + new_tx_id: arg?.newTxId, }) const url = await this.url('transaction/start') diff --git a/packages/client/src/runtime/core/engines/library/LibraryEngine.ts b/packages/client/src/runtime/core/engines/library/LibraryEngine.ts index 06684ecc5a73..aa421ea89362 100644 --- a/packages/client/src/runtime/core/engines/library/LibraryEngine.ts +++ b/packages/client/src/runtime/core/engines/library/LibraryEngine.ts @@ -195,6 +195,7 @@ export class LibraryEngine implements Engine { max_wait: arg.maxWait, timeout: arg.timeout, isolation_level: arg.isolationLevel, + new_tx_id: arg?.newTxId, }) result = await this.engine?.startTransaction(jsonOptions, headerStr) diff --git a/packages/client/src/runtime/core/types/exported/itxClientDenyList.ts b/packages/client/src/runtime/core/types/exported/itxClientDenyList.ts index a16c3b4b4e91..046f4634d05e 100644 --- a/packages/client/src/runtime/core/types/exported/itxClientDenyList.ts +++ b/packages/client/src/runtime/core/types/exported/itxClientDenyList.ts @@ -1,4 +1,4 @@ -const denylist = ['$connect', '$disconnect', '$on', '$transaction', '$use', '$extends'] as const +const denylist = ['$connect', '$disconnect', '$on', '$use', '$extends'] as const export const itxClientDenyList = denylist as ReadonlyArray diff --git a/packages/client/src/runtime/getPrismaClient.ts b/packages/client/src/runtime/getPrismaClient.ts index 5fc2071f31d1..0314d8e6af97 100644 --- a/packages/client/src/runtime/getPrismaClient.ts +++ b/packages/client/src/runtime/getPrismaClient.ts @@ -782,17 +782,21 @@ Or read our docs at https://www.prisma.io/docs/concepts/components/prisma-client */ async _transactionWithCallback({ callback, - options, + options = {}, }: { callback: (client: Client) => Promise - options?: Options + options?: Options & { newTxId?: string } }) { + if (this[TX_ID]) { + options.newTxId = this[TX_ID] + } const headers = { traceparent: this._tracingHelper.getTraceParent() } const optionsWithDefaults: Options = { maxWait: options?.maxWait ?? this._engineConfig.transactionOptions.maxWait, timeout: options?.timeout ?? this._engineConfig.transactionOptions.timeout, isolationLevel: options?.isolationLevel ?? this._engineConfig.transactionOptions.isolationLevel, + newTxId: options.newTxId, } const info = await this._engine.transaction('start', headers, optionsWithDefaults) @@ -803,7 +807,6 @@ Or read our docs at https://www.prisma.io/docs/concepts/components/prisma-client result = await callback(this._createItxClient(transaction)) - // it went well, then we commit the transaction await this._engine.transaction('commit', headers, info) } catch (e: any) { // it went bad, then we rollback the transaction diff --git a/packages/client/tests/functional/extensions/defineExtension.ts b/packages/client/tests/functional/extensions/defineExtension.ts index 3ff061fc8837..3527e5b5490f 100644 --- a/packages/client/tests/functional/extensions/defineExtension.ts +++ b/packages/client/tests/functional/extensions/defineExtension.ts @@ -220,7 +220,6 @@ function itxWithinGenericExtension() { void xclient.$transaction((tx) => { expectTypeOf(tx).toHaveProperty('helperMethod') - expectTypeOf(tx).not.toHaveProperty('$transaction') expectTypeOf(tx).not.toHaveProperty('$extends') return Promise.resolve() }) diff --git a/packages/client/tests/functional/extensions/itx.ts b/packages/client/tests/functional/extensions/itx.ts index a44210f3b318..9545d3161dad 100644 --- a/packages/client/tests/functional/extensions/itx.ts +++ b/packages/client/tests/functional/extensions/itx.ts @@ -315,7 +315,7 @@ testMatrix.setupTestSuite( if (isTransaction) { expect(ctx.$connect).toBeUndefined() expect(ctx.$disconnect).toBeUndefined() - expect(ctx.$transaction).toBeUndefined() + expect(ctx.$transaction).toBeDefined() expect(ctx.$extends).toBeUndefined() } else { expect(ctx.$connect).toBeDefined() diff --git a/packages/client/tests/functional/interactive-transactions/tests.ts b/packages/client/tests/functional/interactive-transactions/tests.ts index 15edb8190f10..51a69c225d56 100644 --- a/packages/client/tests/functional/interactive-transactions/tests.ts +++ b/packages/client/tests/functional/interactive-transactions/tests.ts @@ -1,3 +1,4 @@ +import { faker } from '@faker-js/faker' import { ClientEngineType } from '@prisma/internals' import { copycat } from '@snaplet/copycat' @@ -211,11 +212,77 @@ testMatrix.setupTestSuite( await expect(result).resolves.toHaveLength(2) }) + /** + * If a parent transaction is rolled back, the child transaction should also rollback + * - This is only supported in SQL derived servers + */ + testIf(provider === Providers.POSTGRESQL)('sql: nested rollback', async () => { + const rand1 = Math.floor(Math.random() * 1000) + const rand2 = rand1 + 1 + const email1 = 'user_' + rand1 + '@website.com' + const email2 = 'user_' + rand2 + '@website.com' + const client = prisma + await expect( + client.$transaction(async (tx) => { + await tx.user.create({ + data: { + email: email1, + }, + }) + + await tx.$transaction(async (tx2) => { + await tx2.user.create({ + data: { + email: email2, + }, + }) + }) + + // Abort the outer transaction + throw new Error('Rollback') + }), + ).rejects.toThrow(/Rollback/) + + const result = await prisma.user.findMany({ + where: { + email: { + in: [email1, email2], + }, + }, + }) + + // Both transactions should rollback + expect(result).toHaveLength(0) + }) + + testIf(provider === Providers.POSTGRESQL)('sql: multiple interactive transactions', async () => { + const existingEmail = faker.internet.email() + + await prisma.$transaction(async (tx) => { + await tx.user.create({ data: { email: existingEmail } }) + }) + + await prisma.$transaction(async (tx) => { + await tx.user.create({ data: { email: existingEmail + 1 } }) + }) + + const result = await prisma.user.findMany({ + where: { + email: { + in: [existingEmail, existingEmail + 1], + }, + }, + }) + + // Both transactions should succeed + expect(result).toHaveLength(2) + }) + /** * We don't allow certain methods to be called in a transaction */ test('forbidden', async () => { - const forbidden = ['$connect', '$disconnect', '$on', '$transaction', '$use'] + const forbidden = ['$connect', '$disconnect', '$on', '$use'] expect.assertions(forbidden.length + 1) const result = prisma.$transaction((prisma) => { diff --git a/packages/driver-adapter-utils/src/binder.ts b/packages/driver-adapter-utils/src/binder.ts index d4e922039a14..fa6bbe195c45 100644 --- a/packages/driver-adapter-utils/src/binder.ts +++ b/packages/driver-adapter-utils/src/binder.ts @@ -77,6 +77,7 @@ const bindTransaction = (errorRegistry: ErrorRegistryInternal, transaction: Tran options: transaction.options, queryRaw: wrapAsync(errorRegistry, transaction.queryRaw.bind(transaction)), executeRaw: wrapAsync(errorRegistry, transaction.executeRaw.bind(transaction)), + begin: wrapAsync(errorRegistry, transaction.begin.bind(transaction)), commit: wrapAsync(errorRegistry, transaction.commit.bind(transaction)), rollback: wrapAsync(errorRegistry, transaction.rollback.bind(transaction)), } diff --git a/packages/driver-adapter-utils/src/types.ts b/packages/driver-adapter-utils/src/types.ts index 171844b9b920..1fc00610e44a 100644 --- a/packages/driver-adapter-utils/src/types.ts +++ b/packages/driver-adapter-utils/src/types.ts @@ -177,6 +177,10 @@ export interface Transaction extends Queryable { * Transaction options. */ readonly options: TransactionOptions + /** + * Begin the transaction. + */ + begin(): Promise> /** * Commit the transaction. */ diff --git a/packages/engines/package.json b/packages/engines/package.json index b6418f324432..9d2559bac971 100644 --- a/packages/engines/package.json +++ b/packages/engines/package.json @@ -22,7 +22,7 @@ }, "dependencies": { "@prisma/debug": "workspace:*", - "@prisma/engines-version": "6.2.0-14.4123509d24aa4dede1e864b46351bf2790323b69", + "@prisma/engines-version": "6.2.0-13.integration-sql-nested-transactions4-fa6eebbccfd5b45ef639efcb0fe328c189735aa4", "@prisma/fetch-engine": "workspace:*", "@prisma/get-platform": "workspace:*" }, @@ -39,4 +39,4 @@ "scripts" ], "sideEffects": false -} +} \ No newline at end of file diff --git a/packages/fetch-engine/package.json b/packages/fetch-engine/package.json index f1cc29a52034..d14007eb88aa 100644 --- a/packages/fetch-engine/package.json +++ b/packages/fetch-engine/package.json @@ -43,7 +43,7 @@ }, "dependencies": { "@prisma/debug": "workspace:*", - "@prisma/engines-version": "6.2.0-14.4123509d24aa4dede1e864b46351bf2790323b69", + "@prisma/engines-version": "6.2.0-13.integration-sql-nested-transactions4-fa6eebbccfd5b45ef639efcb0fe328c189735aa4", "@prisma/get-platform": "workspace:*" }, "scripts": { @@ -57,4 +57,4 @@ "dist" ], "sideEffects": false -} +} \ No newline at end of file diff --git a/packages/instrumentation/package.json b/packages/instrumentation/package.json index 55d16ac22697..56d782be350e 100644 --- a/packages/instrumentation/package.json +++ b/packages/instrumentation/package.json @@ -44,4 +44,4 @@ "test": "jest" }, "sideEffects": false -} +} \ No newline at end of file diff --git a/packages/internals/package.json b/packages/internals/package.json index 9ae63f05f891..988db85849da 100644 --- a/packages/internals/package.json +++ b/packages/internals/package.json @@ -85,10 +85,10 @@ "@prisma/fetch-engine": "workspace:*", "@prisma/generator-helper": "workspace:*", "@prisma/get-platform": "workspace:*", - "@prisma/prisma-schema-wasm": "6.2.0-14.4123509d24aa4dede1e864b46351bf2790323b69", + "@prisma/prisma-schema-wasm": "6.2.0-13.integration-sql-nested-transactions4-fa6eebbccfd5b45ef639efcb0fe328c189735aa4", "@prisma/schema-files-loader": "workspace:*", "arg": "5.0.2", "prompts": "2.4.2" }, "sideEffects": false -} +} \ No newline at end of file diff --git a/packages/migrate/package.json b/packages/migrate/package.json index a994cde5775d..b87177520738 100644 --- a/packages/migrate/package.json +++ b/packages/migrate/package.json @@ -56,7 +56,7 @@ }, "dependencies": { "@prisma/debug": "workspace:*", - "@prisma/engines-version": "6.2.0-14.4123509d24aa4dede1e864b46351bf2790323b69", + "@prisma/engines-version": "6.2.0-13.integration-sql-nested-transactions4-fa6eebbccfd5b45ef639efcb0fe328c189735aa4", "@prisma/generator-helper": "workspace:*", "@prisma/get-platform": "workspace:*", "@prisma/internals": "workspace:*", @@ -74,4 +74,4 @@ "dist" ], "sideEffects": false -} +} \ No newline at end of file diff --git a/packages/schema-files-loader/package.json b/packages/schema-files-loader/package.json index 44fcf8982121..b8e55386d5f6 100644 --- a/packages/schema-files-loader/package.json +++ b/packages/schema-files-loader/package.json @@ -22,10 +22,10 @@ ], "sideEffects": false, "dependencies": { - "@prisma/prisma-schema-wasm": "6.2.0-14.4123509d24aa4dede1e864b46351bf2790323b69", + "@prisma/prisma-schema-wasm": "6.2.0-13.integration-sql-nested-transactions4-fa6eebbccfd5b45ef639efcb0fe328c189735aa4", "fs-extra": "11.1.1" }, "devDependencies": { "jest": "29.7.0" } -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5fff35356c4a..1d2bb237163c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -622,8 +622,8 @@ importers: specifier: workspace:* version: link:../engines '@prisma/engines-version': - specifier: 6.2.0-14.4123509d24aa4dede1e864b46351bf2790323b69 - version: 6.2.0-14.4123509d24aa4dede1e864b46351bf2790323b69 + specifier: 6.2.0-13.integration-sql-nested-transactions4-fa6eebbccfd5b45ef639efcb0fe328c189735aa4 + version: 6.2.0-13.integration-sql-nested-transactions4-fa6eebbccfd5b45ef639efcb0fe328c189735aa4 '@prisma/fetch-engine': specifier: workspace:* version: link:../fetch-engine @@ -649,8 +649,8 @@ importers: specifier: workspace:* version: link:../pg-worker '@prisma/query-engine-wasm': - specifier: 6.2.0-14.4123509d24aa4dede1e864b46351bf2790323b69 - version: 6.2.0-14.4123509d24aa4dede1e864b46351bf2790323b69 + specifier: 6.2.0-13.integration-sql-nested-transactions4-fa6eebbccfd5b45ef639efcb0fe328c189735aa4 + version: 6.2.0-13.integration-sql-nested-transactions4-fa6eebbccfd5b45ef639efcb0fe328c189735aa4 '@snaplet/copycat': specifier: 0.17.3 version: 0.17.3 @@ -868,8 +868,8 @@ importers: specifier: workspace:* version: link:../debug '@prisma/engines-version': - specifier: 6.2.0-14.4123509d24aa4dede1e864b46351bf2790323b69 - version: 6.2.0-14.4123509d24aa4dede1e864b46351bf2790323b69 + specifier: 6.2.0-13.integration-sql-nested-transactions4-fa6eebbccfd5b45ef639efcb0fe328c189735aa4 + version: 6.2.0-13.integration-sql-nested-transactions4-fa6eebbccfd5b45ef639efcb0fe328c189735aa4 '@prisma/fetch-engine': specifier: workspace:* version: link:../fetch-engine @@ -905,8 +905,8 @@ importers: specifier: workspace:* version: link:../debug '@prisma/engines-version': - specifier: 6.2.0-14.4123509d24aa4dede1e864b46351bf2790323b69 - version: 6.2.0-14.4123509d24aa4dede1e864b46351bf2790323b69 + specifier: 6.2.0-13.integration-sql-nested-transactions4-fa6eebbccfd5b45ef639efcb0fe328c189735aa4 + version: 6.2.0-13.integration-sql-nested-transactions4-fa6eebbccfd5b45ef639efcb0fe328c189735aa4 '@prisma/get-platform': specifier: workspace:* version: link:../get-platform @@ -1098,7 +1098,7 @@ importers: dependencies: '@opentelemetry/instrumentation': specifier: ^0.52.0 || ^0.53.0 || ^0.54.0 || ^0.55.0 || ^0.56.0 - version: 0.55.0(@opentelemetry/api@1.9.0) + version: 0.56.0(@opentelemetry/api@1.9.0) devDependencies: '@opentelemetry/api': specifier: 1.9.0 @@ -1227,8 +1227,8 @@ importers: specifier: workspace:* version: link:../get-platform '@prisma/prisma-schema-wasm': - specifier: 6.2.0-14.4123509d24aa4dede1e864b46351bf2790323b69 - version: 6.2.0-14.4123509d24aa4dede1e864b46351bf2790323b69 + specifier: 6.2.0-13.integration-sql-nested-transactions4-fa6eebbccfd5b45ef639efcb0fe328c189735aa4 + version: 6.2.0-13.integration-sql-nested-transactions4-fa6eebbccfd5b45ef639efcb0fe328c189735aa4 '@prisma/schema-files-loader': specifier: workspace:* version: link:../schema-files-loader @@ -1399,8 +1399,8 @@ importers: specifier: workspace:* version: link:../debug '@prisma/engines-version': - specifier: 6.2.0-14.4123509d24aa4dede1e864b46351bf2790323b69 - version: 6.2.0-14.4123509d24aa4dede1e864b46351bf2790323b69 + specifier: 6.2.0-13.integration-sql-nested-transactions4-fa6eebbccfd5b45ef639efcb0fe328c189735aa4 + version: 6.2.0-13.integration-sql-nested-transactions4-fa6eebbccfd5b45ef639efcb0fe328c189735aa4 '@prisma/generator-helper': specifier: workspace:* version: link:../generator-helper @@ -1551,8 +1551,8 @@ importers: packages/schema-files-loader: dependencies: '@prisma/prisma-schema-wasm': - specifier: 6.2.0-14.4123509d24aa4dede1e864b46351bf2790323b69 - version: 6.2.0-14.4123509d24aa4dede1e864b46351bf2790323b69 + specifier: 6.2.0-13.integration-sql-nested-transactions4-fa6eebbccfd5b45ef639efcb0fe328c189735aa4 + version: 6.2.0-13.integration-sql-nested-transactions4-fa6eebbccfd5b45ef639efcb0fe328c189735aa4 fs-extra: specifier: 11.1.1 version: 11.1.1 @@ -2644,10 +2644,6 @@ packages: engines: {node: '>=10'} deprecated: This functionality has been moved to @npmcli/fs - '@opentelemetry/api-logs@0.55.0': - resolution: {integrity: sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==} - engines: {node: '>=14'} - '@opentelemetry/api-logs@0.56.0': resolution: {integrity: sha512-Wr39+94UNNG3Ei9nv3pHd4AJ63gq5nSemMRpCd8fPwDL9rN3vK26lzxfH27mw16XzOSO+TpyQwBAMaLxaPWG0g==} engines: {node: '>=14'} @@ -2668,12 +2664,6 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/instrumentation@0.55.0': - resolution: {integrity: sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation@0.56.0': resolution: {integrity: sha512-2KkGBKE+FPXU1F0zKww+stnlUxUTlBvLCiWdP63Z9sqXYeNI/ziNzsxAp4LAdUcTQmXjw1IWgvm5CAb/BHy99w==} engines: {node: '>=14'} @@ -2755,19 +2745,19 @@ packages: resolution: {integrity: sha512-t2XdOfrVgcF7AW791FtdPS27NyNqcE1SpoXgk3HpziousvUMsJi4Q6NL3JyOBpsMOrvk94749o8yyonvX5quPw==} engines: {node: '>=16'} - '@prisma/engines-version@6.2.0-14.4123509d24aa4dede1e864b46351bf2790323b69': - resolution: {integrity: sha512-7tw1qs/9GWSX6qbZs4He09TOTg1ff3gYsB3ubaVNN0Pp1zLm9NC5C5MZShtkz7TyQjx7blhpknB7HwEhlG+PrQ==} + '@prisma/engines-version@6.2.0-13.integration-sql-nested-transactions4-fa6eebbccfd5b45ef639efcb0fe328c189735aa4': + resolution: {integrity: sha512-ZL8pj35tUEaCE8UxFRUVHv52yQ4t7qXwhIjAdjZNLsOJxXWr/gMVIAbQd258EWzTqLOZy3SxUMk1N2nSX3cNZw==} '@prisma/mini-proxy@0.9.5': resolution: {integrity: sha512-0MLaxUjGbZGJGx9fIy1kbAH65hcZHCP6yes8xCTVcWumo64uzAxuvZdf5l1EPCZrDnj+iZNAy0U364oOAN+gXQ==} engines: {node: '>=16'} hasBin: true - '@prisma/prisma-schema-wasm@6.2.0-14.4123509d24aa4dede1e864b46351bf2790323b69': - resolution: {integrity: sha512-3N7czqak9gnE0NnzIaCjAgfA974QVII2MgT5uMe4NR3KmdrAEwtKRbkcdi8m3V2dXUPFpFXoCWjHiyC/3Qvg4A==} + '@prisma/prisma-schema-wasm@6.2.0-13.integration-sql-nested-transactions4-fa6eebbccfd5b45ef639efcb0fe328c189735aa4': + resolution: {integrity: sha512-8/iLd7KkODz8Jy9Rn2zgxHMUAdXHvr5/lE/JJSraA2YrBoORxDP1uA5pw3nx93YOb6OY+jdNN6VW6QLFUdIZXw==} - '@prisma/query-engine-wasm@6.2.0-14.4123509d24aa4dede1e864b46351bf2790323b69': - resolution: {integrity: sha512-6eD5jX2u4uh+eudmiOyjYJR1j+2wQuVtTx+B7KE/H270LmNrpsVdRbSc1xDANzghxn2vML54wTbP/TY1Qgy0WQ==} + '@prisma/query-engine-wasm@6.2.0-13.integration-sql-nested-transactions4-fa6eebbccfd5b45ef639efcb0fe328c189735aa4': + resolution: {integrity: sha512-ap8HJugTmcCRwZNSrTePHXR7AQZ9dfdDJ4tUtr03Ea3pwC9xoHi9pv2n49UZG+5weTjpbd9RE3A9/DYxZ/bgtg==} '@prisma/studio-common@0.503.0': resolution: {integrity: sha512-YLI4uf8hNIg5RaX7lPPSH6qLeSknygMB/2aEqfnWA1kWCHvkTkYEtSoSXLEAIbVc0LWWDawCcDPxFH12v6oSnA==} @@ -6559,7 +6549,7 @@ packages: engines: {node: '>=0.6.19'} string-hash@1.1.3: - resolution: {integrity: sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==} + resolution: {integrity: sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=} string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} @@ -8406,10 +8396,6 @@ snapshots: rimraf: 3.0.2 optional: true - '@opentelemetry/api-logs@0.55.0': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs@0.56.0': dependencies: '@opentelemetry/api': 1.9.0 @@ -8425,18 +8411,6 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.28.0 - '@opentelemetry/instrumentation@0.55.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.55.0 - '@types/shimmer': 1.2.0 - import-in-the-middle: 1.8.1 - require-in-the-middle: 7.2.0 - semver: 7.6.3 - shimmer: 1.2.1 - transitivePeerDependencies: - - supports-color - '@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -8501,13 +8475,13 @@ snapshots: '@planetscale/database@1.18.0': {} - '@prisma/engines-version@6.2.0-14.4123509d24aa4dede1e864b46351bf2790323b69': {} + '@prisma/engines-version@6.2.0-13.integration-sql-nested-transactions4-fa6eebbccfd5b45ef639efcb0fe328c189735aa4': {} '@prisma/mini-proxy@0.9.5': {} - '@prisma/prisma-schema-wasm@6.2.0-14.4123509d24aa4dede1e864b46351bf2790323b69': {} + '@prisma/prisma-schema-wasm@6.2.0-13.integration-sql-nested-transactions4-fa6eebbccfd5b45ef639efcb0fe328c189735aa4': {} - '@prisma/query-engine-wasm@6.2.0-14.4123509d24aa4dede1e864b46351bf2790323b69': {} + '@prisma/query-engine-wasm@6.2.0-13.integration-sql-nested-transactions4-fa6eebbccfd5b45ef639efcb0fe328c189735aa4': {} '@prisma/studio-common@0.503.0': dependencies: