如何解决Sequelize-使用事务进行多次删除查询后,Sqlite数据库被锁定
我目前正面临使用交易的随机问题。代码的逻辑是我有一部电影,一部电影hasMany
的源以及hasMany
个流。从逻辑上讲,当电影被删除时,与之相关的所有内容都应删除。这是通过onDelete: cascade
完成的,但与我无关。
这就是为什么我在代码中使用这种方法的原因。如果最好使用cascade
方式,请告诉我。我正在使用数据库的一个主文件,该文件具有作为函数的模型,它们被保存到数据库而不是内存中。
错误为SQLITE_BUSY: database is locked
。如果我执行代码,则sources_deleted
查询将被执行多次,这意味着它只会说DELETE from links_sources where ..etc
,尽管它只被编写了一次。
如果我删除了streams_deleted
的{{1}}和bulk
,则代码可以正常工作,而不会出现任何查询循环。如果我同时删除了streams
和bulks
中的sources
,那么代码将正常工作。否则,它将引发streams
错误。
我不知道为什么会发生这种行为,而且我不确定如何避免进行不良练习。我应该改变方法还是缺少一些东西?
非常感谢您的帮助。
电影模型
locked
源模型
function getModelMovie(isInstance) {
let table = sequelize.define('movies',{
id: {
type: DataTypes.INTEGER,primaryKey: true,autoIncrement: true
},title: {
type: DataTypes.STRING,allowNull: false
},disma_old_id: {
type: DataTypes.INTEGER,allowNull: true
},disma_new_id: {
type: DataTypes.INTEGER,},{
});
if (!isInstance) {
table.hasMany(getModelLinksSource(true,constants.MEDIA_TYPES.MEDIA_TYPE_MOVIE),{
foreignKey: 'sourceable_id',constraints: false,scope: {
sourceable_type: constants.MEDIA_TYPES.MEDIA_TYPE_MOVIE
},as: "sources",});
table.hasMany(getModelLinksStreams(true,{
foreignKey: 'streamable_id',scope: {
streamable_type: constants.MEDIA_TYPES.MEDIA_TYPE_MOVIE
},as: "streams",});
}
return table
}
流模型
function getModelLinksSource(isInstance,type) {
let table = sequelize.define('links_sources',url: {
type: DataTypes.STRING,sourceable_type: {
type: DataTypes.STRING,sourceable_id: {
type: DataTypes.INTEGER,allowNull: false
}
},{
});
if (!isInstance) {
if (type === constants.MEDIA_TYPES.MEDIA_TYPE_MOVIE) {
table.belongsTo(getModelMovie(true),{
foreignKey: 'streamable_id',scope: {
sourceable_type: constants.MEDIA_TYPES.MEDIA_TYPE_MOVIE
},as: "movie"
});
} else if (type === constants.MEDIA_TYPES.MEDIA_TYPE_SEASON) {
table.belongsTo(getModelSeason(true),{
foreignKey: 'sourceable_id',scope: {
sourceable_type: constants.MEDIA_TYPES.MEDIA_TYPE_SEASON
},as: "seasons"
});
}
}
return table
}
editMovie功能
function getModelLinksStreams(isInstance,type) {
let table = sequelize.define('links_streams',streamable_type: {
type: DataTypes.STRING,streamable_id: {
type: DataTypes.INTEGER,{
});
if (!isInstance) {
if(type === constants.MEDIA_TYPES.MEDIA_TYPE_MOVIE){
table.belongsTo(getModelMovie(true),as: "movie"
});
}
}
return table
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。