javascript - 在模型上使用 beforeCreate 和 findOrCreate 导致 Sequelize 发生死锁

标签 javascript mysql node.js deadlock sequelize.js

我收到错误:

Unhandled rejection SequelizeDatabaseError: ER_LOCK_DEADLOCK: Deadlock found when trying to get lock; try restarting transaction

这是我的模型:

var bcrypt = require('bcryptjs');

module.exports = function (sequelize, DataTypes) {
    var User = sequelize.define('User', {
        username: {type: DataTypes.STRING, unique: true},
        password: DataTypes.STRING,
        email: DataTypes.STRING,
        isAdmin: DataTypes.BOOLEAN,
        isActive: DataTypes.BOOLEAN
    }, {
        classMethods: {
            associate: function (models) {
                User.hasMany(models.Comment);
                User.hasMany(models.Message, {as: 'receivedMessages', foreignKey: 'Receiver'});
                User.hasMany(models.Message, {as: 'sentMessages', foreignKey: 'Sender'});
            }
        }
    });

    User.hook('beforeCreate', function (user, options, fn) {
        bcrypt.genSalt(SALT_WORK_FACTOR, function (err, salt) {
            if (err) {
                return next(err);
            }
            bcrypt.hash(user.password, salt, function (err, hash) {
                if (err) {
                    return next(err);
                }
                user.password = hash;
                return fn(err, user);
            });
        });
    });

    User.findOrCreate({
        where: {
            username: 'admin'
        },
        defaults: {
            username: 'admin',
            email: 'admin@admin.com',
            password: 'admin',
            isAdmin: true,
            isActive: true
        }
    });

    return User;
};

如果我删除其中一个钩子(Hook)(beforeCreate 或 findOrCreate),它就可以正常工作。

这似乎是一个关于事务的问题,但我找不到让它工作的方法。

文档讨论了传递事务,但我不知道如何将事务传递给 findOrCreate。 这是文档:http://docs.sequelizejs.com/en/latest/docs/hooks/#model-hooks

有什么想法吗?提前致谢!!

最佳答案

不是解决方案,而是解决方法,我没有使用 Hook “findOrCreate”,而是自己完成了它:

User.find(
    {
        where: {
            username: 'admin'
        }
    }
).then(function (user) {
        if (!user) {
            User.create({
                username: 'admin',
                email: 'admin@admin.com',
                password: 'admin',
                isAdmin: true,
                isActive: true
            }).then(function (newUser) {
                console.log('Admin created with id: ' + newUser.id);
            });
        }
    }
);

也许不是最好的答案,但它有效。

关于javascript - 在模型上使用 beforeCreate 和 findOrCreate 导致 Sequelize 发生死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36367229/

相关文章:

javascript - 如何在javascript中包含液体?

javascript - 在移动 View (wordpress)中更改列顺序。有可能的?

javascript - AngularJS 对象序列化的缺点

node.js - 我们可以将 multer 配置为不在本地存储文件并且仅用于使用 req.files.image.path 吗?

javascript - 在谷歌网站上创建的网站上的谷歌地图 Javascript API

php - 使用 PHP 和 JS 生成相同的 HTML

java - jdbc 无法与 java 连接

mysql - SQL:查询连接中的重复行

带游标的 MySQL 存储过程

javascript - 是否可以将 Realm 与 A​​ngular 2 一起使用?