おそらく2つ以上の同時プロセスから、重複することなくいくつかのデータを挿入しようとしています。
残念ながら、データベースの設計上、この場合一意の制約を使用できません (削除された行は でマークされdeleted=1
、重複として存在する可能性があります)。
単純なトランザクションは機能しないようです-私が思いつくことができる最高SELECT ... FOR UPDATE
のものは ですが、それだけでは十分ではありません-行がまだ存在しない場合、行はロックされないため、挿入は妨げられません。一方、書き込みのためにテーブル全体をロックすることは避けたいと思います。
この問題を回避する良い方法はありますか? テーブル エンジンは InnoDB です。(二次的な質問は-sqlalchemyで機能させる方法ですが、一般的に機能する場合は解決策を翻訳できます)
編集:スキーマを想定できます:
deleted tinyint(1) default null,
id int(11) not null auto_increment,
address varchar(255) default null,
...
ここで、アドレスはエントリに対して一意である必要がありますdeleted == 0
。