トランザクション ブロックに含まれるテーブルの一意キー制約に問題がある。
重要な制約の目的は、プレーヤーがゲーム - チーム - ピリオド - ゴールタイム - プレーヤーごとに複数のゴールまたはアシストを持たないようにすることです。これは正常に機能し、スコアリング レコードが重複することはありません。
ただし、チームが間違ったゴール スコアラーまたはアシスト ゲッターを選択した場合 (たとえば、プレーヤー A がアシストを取得したが、ゴールのクレジットを取得する必要があった場合)、記録を更新したい場合、キーの制約により、プレーヤー A として更新が行われなくなります。更新の時点で、同じゴールにゴールとアシストの両方が含まれます。
私は JDBC SQL ラッパーを使用しているため、生成された SQL を直接制御することはできません。
これを回避するために、既存のゴールを削除して挿入することにしました。これらはすべてトランザクション ブロック内にあります。同じ取引、キーの制約に違反しています。同じトランザクション ブロック内で削除と挿入を行うことはできますか? 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") ) }