1

を使用して次の更新ステートメントがある場合Sequelize

return models.UnitPlant.findOne(
        {
            where:
            {
                id: unitPlantToUpdate.id
            },
            include: [
                { model: models.ProductType },
                { model: models.VehiclePlant, as: 'Customers' }
            ]
        })
        .then(function (unitPlantFromDb) {
            return models
                .sequelize
                .transaction(
                {
                    isolationLevel: models.sequelize.Transaction.ISOLATION_LEVELS.READ_COMMITTED
                },
                function (t) {
                    return unitPlantFromDb.update(unitPlantToUpdate, { transaction: t })
                        .then(function (unitPlantFromDb) {
                            return unitPlantFromDb.setProductType(unitPlant.ProductType.id, { transaction: t })
                        })
                        .then(function (unitPlantFromDb) {
                            return unitPlantFromDb.setCustomers(unitPlant.customerIds, { transaction: t });
                        });
                })
                .then(function (result) {
                    return output.getSuccessResult(titles.SUCCESS, validationMessages.SUCCESS_ON_UPDATE, UNIT_PLANT)
                })
                .catch(function (error) {
                    console.log(error);
                    return output.getErrorResult(titles.ERROR_ON_UPDATE, validationMessages.ERROR_ON_UPDATE, error.message);
                });
        });

に 1 対多の関係があることに注意してUnitplantくださいCustomer。上記のコードは正常に動作しますが、更新時に削除のみまたは挿入のみの場合に限りcustomersます。

両方が発生するたびに、次のエラーが発生します。

未処理の拒否 SequelizeDatabaseError: 要求は、SentClientRequest 状態ではなく、LoggedIn 状態でのみ行うことができます

コンソールからこれが起こります:

Executing (783e1de2-5013-43b9-80e9-248dca6d83e1): BEGIN TRANSACTION;
Executing (783e1de2-5013-43b9-80e9-248dca6d83e1): SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
Executing (783e1de2-5013-43b9-80e9-248dca6d83e1): UPDATE [UnitPlants] SET [expiresAt]='2016-06-22',[updatedAt]='2016-06-03 12:57:50.000 +00:00' OUTPUT INSERTED.* WHERE [id] = 15
Executing (783e1de2-5013-43b9-80e9-248dca6d83e1): UPDATE [UnitPlants] SET [ProductTypeId]=1,[updatedAt]='2016-06-03 12:57:50.000 +00:00' OUTPUT INSERTED.* WHERE [id] = 15
Executing (783e1de2-5013-43b9-80e9-248dca6d83e1): SELECT [VehiclePlant].[id], [VehiclePlant].[code], [VehiclePlant].[name], [VehiclePlant].[expiresAt], [VehiclePlant].[createdAt], [VehiclePlant].[upoCustomer], [VehiclePlant].[isExport], [VehiclePlant].[updatedAt], [UnitPlantCustomers].[createdAt] AS [UnitPlantCustomers.createdAt], [UnitPlantCustomers].[updatedAt] AS [UnitPlantCustomers.updatedAt], [UnitPlantCustomers].[UnitPlantId] AS [UnitPlantCustomers.UnitPlantId], [UnitPlantCustomers].[VehiclePlantId] AS [UnitPlantCustomers.VehiclePlantId] FROM [VehiclePlants] AS [VehiclePlant] INNER JOIN [UnitPlantCustomers] AS [UnitPlantCustomers] ON [VehiclePlant].[id] = [UnitPlantCustomers].[VehiclePlantId] AND [UnitPlantCustomers].[UnitPlantId] = 15;
Executing (783e1de2-5013-43b9-80e9-248dca6d83e1): DELETE FROM [UnitPlantCustomers] WHERE [UnitPlantId] = 15 AND [VehiclePlantId] IN (4); SELECT @@ROWCOUNT AS AFFECTEDROWS;
Executing (783e1de2-5013-43b9-80e9-248dca6d83e1): INSERT INTO [UnitPlantCustomers] ([createdAt],[updatedAt],[UnitPlantId],[VehiclePlantId]) VALUES ('2016-06-03 12:57:50.000 +00:00','2016-06-03 12:57:50.000 +00:00',15,3);
Executing (783e1de2-5013-43b9-80e9-248dca6d83e1): ROLLBACK TRANSACTION;

そこのINSERTDELETEに注意してください。

両方を持っている場合にのみ、なぜこれが起こるのですか? そして、どうすればこの問題に取り組むことができますか?

補足として、トランザクションを使用しない場合でもすべてが機能するため、選択した分離レベルが間違っているのか、トランザクションのセットアップ全体が間違っているのか疑問に思います。

4

1 に答える 1

1

既定では、退屈な (ノード mssql ドライバー) は 1 つの同時要求のみをサポートしますが、他の db ライブラリはクエリ キューイングを自動的に管理します。Sequelize バージョン 3.22 で修正する必要があります。

https://github.com/sequelize/sequelize/pull/5752

于 2016-06-06T07:26:43.527 に答える