MySQL处理来自2个不同连接的查询的顺序是什么?

时间:2012-11-10 20:41:15

标签: php mysql

假设我有两个文件file1.phpfile2.php

file1.php具有以下查询:

-query 1
-query 2
-query 3

file2.php具有以下查询:

-query 4
-query 5
-query 6

假设一个访问者运行第一个脚本而另一个访问者同时运行第二个脚本。

我的问题是:在执行第一个脚本的所有查询时,MySQL是否接收到一个连接并将第二个连接保留在队列中,然后转到第二个连接?

MySQL处理的查询顺序是1,2,3,4,5,6(或4,5,6,1,2,3)还是可以按任何顺序排列?

我可以做些什么来确保MySQL在转移到另一个连接之前执行一个连接的所有查询?

我关注数据完整性。例如,共享同一帐户的两个用户的帐户余额。他们可能会看到相同的值,但如果他们同时发送查询,这可能会导致一些意外的结果

4 个答案:

答案 0 :(得分:3)

数据库可以并行接受来自多个连接的查询。它可以以任意顺序执行查询,甚至可以同时执行。隔离级别定义了并行执行可能对结果产生的影响:

如果您不使用事务,则可以并行执行查询,并且最强的隔离级别仍然只保证 查询将返回与相同的结果 >它们不是并行执行的,但仍可以任何顺序运行(只要它们在每个连接中排序)

如果您使用交易,数据库可以保证更多:

最强的隔离级别为serializable,这意味着结果将,好像没有两个事务并行运行,但性能会受到影响。

最弱的隔离级别与根本不使用事务相同;任何事情都可能发生。

如果要确保数据一致性,请使用事务:

START TRANSACTION;
...
COMMIT;

默认隔离级别为read-commited,大致相当于serializable,普通SELECT发生在事务外。如果您对事务中的每个SELECT使用SELECT FOR UPDATE,则会获得serializable

请参阅:http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html#isolevel_repeatable-read

答案 1 :(得分:2)

一般情况下,您无法预测或控制执行顺序 - 可以是1,2,3,4,5,6或4,5,6,1,2,3或1,4,2,5, 3,6或其中的任何组合。

MySQL并行执行来自多个连接的查询,并且所有客户端共享服务器性能(在您的情况下为2)。 我不认为您有理由担心或改变这一点 - MySQL是为此而创建的,以便能够提供多个连接。

如果遇到性能问题,通常可以通过添加索引或更改数据库架构来解决这些问题 - 例如对表进行规范化或非规范化。

答案 2 :(得分:1)

您可以将max_connections限制为1,但是对于其他连接,它会给您too many connections错误。限制并发执行毫无意义。

答案 3 :(得分:1)

  1. 将操作设为transaction并将auto commit设置为false
  2. 以相同的顺序访问所有表,以防止死锁。