在模型上使用beforeCreate和findOrCreate与Sequelize发生死锁
Deadlock with Sequelize using beforeCreate and findOrCreate on a model
我得到错误:
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;
};
如果我移除其中一个钩子(beforeCreate或findOrCreate),它会很好地工作。
这似乎是一个关于交易的问题,但我找不到让它发挥作用的方法。
文档谈到了传递事务,但我不知道如何将事务传递给findOrCreate。这是医生:http://docs.sequelizejs.com/en/latest/docs/hooks/#model-挂钩
知道吗?提前感谢!!
不是一个解决方案,而是一个变通方法,我没有使用钩子"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);
});
}
}
);
也许不是最好的答案,但它有效。
也可以使用Promise.resolve
Promise.resolve(clientService.update(previousClient, { qa_inspection_template_id: null }, userId, transaction)).then(async ()=>
{
const client = await clientService.show(data.client_id, true);
await clientService.update(client, { qa_inspection_template_id: template.id }, userId, transaction);
});
相关文章:
- 从Sequelize中的非实例更新
- Sequelize:这些方法应该驻留在哪里
- Sequelize associations:set[Models]添加新模型,而不是关联现有模型
- Sequelize和嵌套结果
- Sequelize:属性之间的命名冲突'播放列表'以及关联'播放列表'
- 如何防止Sequelize添加'Id'到列名
- 如何使用hasOne和sequelize.js引用两个表
- Sequelize:使用多个数据库
- Meteor-在一段时间内解锁模板(按日期)
- Sequelize where语句外键表
- Sequelize hasMany浏览另一张表
- sequelize为找到的对象添加值
- 在创建时使用 Sequelize 保存时获取关联
- Sequelize.js中获取验证器错误
- JS Sequelize "Where Related" Query?
- Sequelize多对多-如何创建新记录并更新联接表
- 安装Sequelize时出错
- 使用Sequelize.js创建简单PUT请求时出错
- ES6 and sequelize-cli
- 在模型上使用beforeCreate和findOrCreate与Sequelize发生死锁