insert into table1 ...;
update table2 set count=count+1;上面的代码将一些内容插入到table1中,如果成功,则更新table2的count字段。
当然,这类事情可以由事务处理,但事务需要锁定表,这在高并发系统中效率不高。如果您需要在该事务中更新多个表,情况可能会更糟。
你的解决方案是什么?
我使用PHP,并以这种方式实现事务:
mysql_query('begin');
mysql_query($statement1);
mysql_query($statement2);
...
mysql_query('commit');所以看起来在这些$statement中引用的所有表都将被锁定?
发布于 2010-01-26 20:27:06
事务(在MySQL上下文中假定为InnoDB)将不需要锁定整个表。
INSERT将在没有间隙锁的情况下锁定单个行。
如果您在WHERE子句中的索引字段上提供了相等或IN条件,则UPDATE也不会锁定任何间隙。
这意味着,使用正确索引的表,INSERTs将不会相互阻塞,而UPDATEs仅在它们影响同一行时才会相互阻塞。
UPDATE当然会锁定它所影响的单个行,但因为它是事务中的最后一个操作,所以在提交操作后,锁将立即解除。
锁定本身实际上是必需的,因此两个并发更新将按顺序递增计数。
发布于 2010-01-26 20:27:37
使用InnoDB存储引擎。它是行级锁定,而不是MyISAM,后者是表级锁定。
发布于 2010-01-26 20:27:42
事务不一定会请求整个表的锁。
此外,InnoDB使用不同的锁定策略支持不同的转换隔离级别。您可能需要检查:
https://stackoverflow.com/questions/2139285
复制相似问题