首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有比交易更有效的方法?

有没有比交易更有效的方法?
EN

Stack Overflow用户
提问于 2010-01-26 20:22:55
回答 6查看 238关注 0票数 3
代码语言:javascript
复制
insert into table1 ...;
update table2 set count=count+1;

上面的代码将一些内容插入到table1中,如果成功,则更新table2count字段。

当然,这类事情可以由事务处理,但事务需要锁定表,这在高并发系统中效率不高。如果您需要在该事务中更新多个表,情况可能会更糟。

你的解决方案是什么?

我使用PHP,并以这种方式实现事务:

代码语言:javascript
复制
mysql_query('begin');

mysql_query($statement1);

mysql_query($statement2);
...
mysql_query('commit');

所以看起来在这些$statement中引用的所有表都将被锁定?

EN

回答 6

Stack Overflow用户

发布于 2010-01-26 20:27:06

事务(在MySQL上下文中假定为InnoDB)将不需要锁定整个表。

INSERT将在没有间隙锁的情况下锁定单个行。

如果您在WHERE子句中的索引字段上提供了相等或IN条件,则UPDATE也不会锁定任何间隙。

这意味着,使用正确索引的表,INSERTs将不会相互阻塞,而UPDATEs仅在它们影响同一行时才会相互阻塞。

UPDATE当然会锁定它所影响的单个行,但因为它是事务中的最后一个操作,所以在提交操作后,锁将立即解除。

锁定本身实际上是必需的,因此两个并发更新将按顺序递增计数。

票数 3
EN

Stack Overflow用户

发布于 2010-01-26 20:27:37

使用InnoDB存储引擎。它是行级锁定,而不是MyISAM,后者是表级锁定。

票数 2
EN

Stack Overflow用户

发布于 2010-01-26 20:27:42

事务不一定会请求整个表的锁。

此外,InnoDB使用不同的锁定策略支持不同的转换隔离级别。您可能需要检查:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2139285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档