gpt4 book ai didi

mysql - 交易陷阱 22

转载 作者:行者123 更新时间:2023-11-29 03:41:05 26 4
gpt4 key购买 nike

事务 block 中涉及的表的唯一键约束有问题。

关键约束的目的是防止一名球员在每个 game-team-period-goaltime-player 有多个进球或助攻。这很好用,没有重复的评分记录,太棒了。

但是,如果球队选择了错误的进球得分手或助攻手(例如,球员 A 获得了助攻但本应获得进球的荣誉),然后想要更新记录,关键约束会阻止更新发生作为球员 A,在更新时,将同时拥有进球和助攻。

我应该提一下,我使用的是 JDBC SQL 包装器,因此我无法直接控制生成的 SQL。

为了解决这个问题,我决定删除现有目标并插入,所有这些都在一个事务 block 中。同样的交易,违反了关键约束。是否可以在同一个事务 block 中删除和插入?生成 SQL 的代码类似于:

db.handle withSession { implicit ss: SS =>
ss.withTransaction {
val result = for{
d <- teams.map{id=> model.delete(gameID, id)}
s <- rows.map{x=> model.insert(x)}
} yield s
}
}
if(result.forall(_.isRight)) Right
else { ss.rollback; Left( i18n("not updated") ) }

最佳答案

解决方案是在单个查询中删除整个游戏,或者,如果只有 1 个团队的统计数据被提交更新(我们的系统允许),则删除该团队在目标游戏中的统计数据。

在删除完整统计信息的情况下,我们有:

db.handle withSession { implicit ss: SS =>
ss.withTransaction {
val result = for{
d <- model.delete(gameID)
s <- rows.map{x=> model.insert(x)}
} yield s
}
}
if(result.forall(_.isRight)) Right
else { ss.rollback; Left( i18n("not updated") ) }

关键是,它似乎不能执行多个删除查询,然后执行多个插入以重新填充事务 block 中已删除的数据,其中存在键约束,否则将被不删除待插入数据破坏.

不确定这是否有意义或是否正确 ;-),但在单个查询中执行删除确实允许随后的插入执行而不会出现问题。

两全其美,可以保留所需的键约束,并执行事务性删除/插入(注意:我不能 REPLACE INTO 因为 JDBC 包装器库不支持它)。

关于mysql - 交易陷阱 22,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13783072/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com