SQL最后一次插入Drupal.它真的线程安全吗?

cod*_*ama 8 mysql concurrency multithreading drupal

我有一个可能连续由多个用户执行的查询.我很害怕,如果我运行db_last_insert_id命令,由于并发性,某些用户可能无法获得最后一个插入ID.但根据:http://api.drupal.org/api/function/db_last_insert_id/6,它说:

返回最后一个插入ID.此功能是线程安全的.

我的问题是,这个线程如何安全?代码只是:

<?php
  function db_last_insert_id($table, $field) {
   return db_result(db_query("SELECT CURRVAL('{". db_escape_table($table) ."}_". db_escape_table($field) ."_seq')"));
  }
?> 
Run Code Online (Sandbox Code Playgroud)

我没有看到任何关于锁定表或什么都没有?

Pas*_*TIN 19

使用MySQL (你似乎用你的问题上的标签表示),这个函数db_last_insert_id()是这样定义的:

function db_last_insert_id($table, $field) {
  return db_result(db_query('SELECT LAST_INSERT_ID()'));
}
Run Code Online (Sandbox Code Playgroud)

database.mysql-common.inc


LAST_INSERT_ID()取决于连接(引用,强调我的):

生成的ID在每个连接的基础上在服务器中维护.这意味着函数返回给定客户端的AUTO_INCREMENT值是为该客户端影响AUTO_INCREMENT列的最新语句生成的第一个 值.此值不受其他客户端的影响,即使它们生成 AUTO_INCREMENT自己的值.此行为可确保每个客户端都可以检索自己的ID,而无需关心其他客户端的活动,也无需锁定或事务.

所以,我会说这对MySQL来说相当不错;-)


您发布的定义实际上是用于PostGreSQL的定义:

function db_last_insert_id($table, $field) {
  return db_result(db_query("SELECT CURRVAL('{". db_escape_table($table) ."}_". db_escape_table($field) ."_seq')"));
}
Run Code Online (Sandbox Code Playgroud)

database.pgsql.inc


序列上的pgsql手册 (引用;强调我的):

currval

返回当前会话中此序列的nextval最近获得的值 .(如果在此会话中从未为此序列调用nextval,则会报告错误.)请注意,由于这会返回会话本地值,因此无论其他会话是否已执行nextval,因此它提供了可预测的答案.

所以,对于PostGreSQL,我猜这也很好.

  • 你很受欢迎:-) huhu ^^你还要问其他10个问题,我知道答案:-D (2认同)