0

t_logdatabaseにテーブルがあるとします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 つのレコードがあります。

この種の無効なレコードを防ぐ良い方法はありますか? ありがとうございました。

4

1 に答える 1