MySQL 中简单和复杂存储过程的线程安全

Thread-safety of a simple & complex stored procedure in MySQL

出于这个问题的目的,我将 复杂 存储过程定义为 'one involving (at least) one cursor and (at least) one loop to insert data into a temporary table and then return the records from the said temporary table'。

在处理如此复杂的存储过程时,有人告诉我,当两个不同的用户登录到应用程序时执行调用相同过程的操作,因为该过程很复杂,可能需要几秒钟的时间(~ 10 秒)完成执行,那么结果可能不忠实于每个用户。也就是说,结果可能会混淆,一个用户可能会看到为另一个用户准备的结果,因为他们试图访问 same 临时 table。

建议为每个用户使用系统生成的唯一标识符,以便区分每个用户的结果集。

现在,我想知道以下内容:-

  1. 是否可以通过使用任何 table 或数据库引擎配置设置来避免并发问题?

  2. 这是否违反了一项或多项 ACID 属性?使用完全符合 ACID 的数据库引擎(例如我正在使用的 InnoDB)如何影响这个问题?

  3. 简单 存储过程的情况下,仅涉及一个 SELECT 语句连接多个 tables,但没有临时的 tables,当执行时间几乎总是在一秒以下时,并发仍然是一个问题吗?

好的,"cursor"是无关紧要的。您只需要一个长 运行 存储过程 运行 同时在同一用户的多个连接中。

一个connection(别名session)是"independence"的单位。一个实体(例如 table)要么是特定于连接的,要么是全局的(除了权限问题)。什么都没有"specific to a user".

CREATE TEMPORARY TABLE 对于创建它的 连接 是唯一的。 last_insert_id() 同上。这些是 "thread-safe",因为 "connection" 是 "thread"。

如果你想让多个连接(同一用户或不同用户)访问同一个 "temporary" table,那么你可以创建一个非 TEMPORARY table 并以某种方式知道 table.

的名称