条件我需要完成以下任务:锁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