1

假设我有两个文件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

4 回答 4

3

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

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

如果使用事务,数据库可以保证更多:

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

最弱的隔离级别和完全不使用事务一样;什么事情都可能发生。

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

START TRANSACTION;
...
COMMIT;

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

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

于 2012-11-10T20:59:47.897 回答
2

通常,您无法预测或控制执行顺序 - 它可以是 1,2,3,4,5,6 或 4,5,6,1,2,3 或 1,4,2,5,3,6或这些的任何组合。

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

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

于 2012-11-10T20:54:16.337 回答
1

您可以限制max_connections为 1,但它会给您too many connections其他连接的错误。限制并发执行是没有意义的。

于 2012-11-10T20:58:35.403 回答
1
  1. 将操作作为事务并将自动提交设置为 false
  2. 以相同的顺序访问所有表,因为这样可以防止死锁。
于 2012-11-10T21:06:52.730 回答