mysql - 如何在单个 session 期间同步对用户变量的访问?

标签 mysql

  1. 我需要在mysql的prepare语句中使用用户变量 存储过程。 (目的是替换表名 drop table 命令,无法通过注入(inject)? 和 通过 execute using... 语句传递,因为它不是数据元素)
  2. 我认为用户变量是 session 范围的全局变量。
  3. 我认为访问用户变量的存储过程必须是 同步以防止调用时发生不需要的行为 在单个 session 中同时进行更多次(我无法阻止)。

如何执行此类同步?
是否有可能由mysql内部执行?

看起来像 mysql get_lock() & co。使用的逻辑没有多大帮助: get_lock('a') 后跟 get_lock('b') 会破坏 a 的状态。也许我在这里严重错过了一些要点......

对于那些会问“您到底想做什么”问题的人:

drop   procedure if exists drop_t_table; delimiter $$
create procedure           drop_t_table(in in_t_table_name varchar(128))
begin
    declare sql_drop varchar(256) default 'drop temporary table if exists ';

    --
    -- I would suspect sql_drop_table user variable guard should be locked here...
    --
    set @sql_drop_table = concat(sql_drop, in_t_table_name);
    --
    -- What if the procedure is preempted to another call here 
    -- and the sql_drop_table gets different table name?
    --
    prepare exe from @sql_drop_table;
    --
    -- ...and unlocked here
    --
    execute            exe;
    deallocate prepare exe;    
end$$ delimiter ;

最佳答案

在存储过程中声明的变量是该过程的本地变量。代码中的 sql_drop 就是一个示例。

每个 session 基本上都是单线程的。在一个 session 中,您一次不能做多于一件事。无法在特定 session 中多次调用存储过程。

如果您有多个 session ,您可以从两个 session 中调用相同的存储过程。但是,DROP TABLE 操作基本上是幂等:如果多次调用它,它与仅调用它一次具有相同的效果。它并不完全是幂等的:如果表不存在,它会抛出错误。但是,多次删除同一个表并不比删除一次更具破坏性。

临时表 (a) 仅对创建它们的 session 可见,(b) 在 session 结束时消失。因此,费尽心思明确地删除它们可能有点矫枉过正。

所以,恕我直言,您可能对这个问题想得太多了。

关于mysql - 如何在单个 session 期间同步对用户变量的访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30462020/

相关文章:

mysql - SQL 行共享相同的列值并与 where

MySQL 获取最大时间戳和关联键

mysql - MySQL 中生成的列中的日期时间错误

简单术语的 MySql 字段类型

mysql - Bluemix ClearDB - 表在不活动后不存在

mysql - 如何删除两个表上内部连接的重复

mysql - 在检查条件时连接 SQL 中的两个表

php - 如何使用POST上传图片和文字

mysql - Ubuntu 18.04 sudo apt-get 更新不起作用

MySQL - 有没有办法更改更新的 ENCLOSED IN 字符?