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