t_log
databaseにテーブルがあるとしますTest
。t_log は次のようになります。
create table `t_log`(
`F_log_id` bigint(20) not null AUTO_INCREMENT,
`F_trans_id` bigint(20) not null,
`F_action` tinyint(3) not null,
primariy key(`F_log_id`)
)engine=innodb
フィールドF_action
が 1 と 2 のようないくつかの特定の値しかとれないとします。 F_action
=1 レコードの場合、対応する値F_trans_id
は互いに異なる必要があります。F_action
=2 レコードの場合、対応はF_trans_id
同じ値を取ることができます。
たとえば、次の表のようなレコードが有効である必要があります
F_log_id | F_action | F_trans_id
1 1 1001
2 2 1002
3 2 1002
ただし、次のようなレコードは有効ではありません
F_log_id | F_action | F_trans_id
1 1 1001
2 1 1001
3 2 1002
に対する一意の制限F_trans_id
は の特定の値に依存するF_action
ため、単に F_trans_id および F_action に対して一意のインデックスを構築することはできません。
一貫性を保つために、t_log へのレコードの挿入は、次のようなトランザクションに入れられます。
start_transaction()
select and check if valid
do inserting
commit()
ただし、同時実行性の高い環境では、2 つの挿入トランザクションがほぼ同時に到着する場合があります。見つかったレコードは有効であり、挿入します。次にt_log
、無効な 2 つのレコードがあります。
この種の無効なレコードを防ぐ良い方法はありますか? ありがとうございました。