條件我需要完成以下任務:鎖SQL表,則執行交易,用於插入上選擇值
我需要兩行插入到相同的表,並且或者兩個被插入,或兩者都不是(原子插入兩排)。
我做這在一個InnoDB表使用事務,像這樣:
$db->beginTransaction();
# Using PDO prepared statments, execute the following queries:
INSERT INTO t1 set uid=42, foo=1
INSERT INTO t1 set uid=42, foo=2
$db->commit();
不過我也只希望如果有在列具有值「42」表中沒有任何行插入這些行。
所以我做的:
$stmt = $db->prepare("SELECT id FROM t1 WHERE uid != ?");
$stmt->execute(array(42));
if($stmt->fetchColumn() < 0){
# There is no row with uid=42, so
# perform insertions here as per above.
INSERT INTO t1 set uid=42, foo=1
INSERT INTO t1 set uid=42, foo=2
}
但是這裏有一個競爭條件,因爲與UID = 42檢查該行之後,並插入新行權前可以插入一排。
我應該如何解決這個問題?
我可以鎖定表,然後在表鎖中執行InnoDB事務嗎?
我可以在事務內部做選擇以檢查uid = 42的現有行嗎?那種族沒有條件嗎?
看看REPLACE INTO ..而不是INSERT。但是,如果記錄已經存在,它將執行更新。 – Waygood 2012-08-10 16:30:44
看到你的表格模式會很有趣。這聽起來像你想要做的是強制一個唯一的索引,而沒有一個唯一的索引字段本身。雖然我可以看到你試圖用同一個uid插入多行,這對我來說並不合適。看起來你的問題可能通過表格標準化和使用唯一索引來解決。 – 2012-08-10 16:31:39
我的想法是重複檢查42 - 在你提交之前和之後。 – 2012-08-10 16:32:32