Chinaunix首页 | 论坛 | 博客
  • 博客访问: 192148
  • 博文数量: 43
  • 博客积分: 366
  • 博客等级: 一等列兵
  • 技术积分: 427
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-17 14:03
文章分类

全部博文(43)

文章存档

2018年(2)

2017年(5)

2016年(2)

2015年(3)

2014年(9)

2013年(5)

2012年(8)

2011年(9)

我的朋友

分类: LINUX

2012-08-29 19:02:20

第一次遇到这个问题,网上也没查到相关办法,特发博客记录一手
先定义2个临时叫法:
1级存储过程:触发器中直接调用的存储过程
N+1级存储过程:1级存储过程调用的子存储过程,以及子存储过程调用的存储过程。。。。。

先大概说一下:
1、官方文档表示:如果运行了lock table,则以后对任何表进行操作前,都必须lock table,否则,就提示本文标题那个错误。
2、有个特殊情况,就是,在被lock表的触发器中,如果写了对另外一个实体表的操作,则另外那个实体表自动被加相同的锁。该原则,适用于1级及N+1级所有存储过程,所有在操作涉及到的实体表都会自动被加相同的锁,所以都不会出错。
3、但,如果被lock表的触发器的1级存储过程创建了一个临时表,则该临时表只能在本存储过程内被操作,N+1级存储过程想对其进行操作,则会提示:Table 'xxxxx' was not locked with LOCK TABLES。
4、存储过程中不能使用lock table语句

然后,我就发现了一个有意思的办法,就是“声明”
只要在N+1级存储过程中,这样声明一下1级存储过程创建的临时表名,就可以安全过关了:create temporary table if not exists xxxxx(col1 int);
此时列名、类型都不需要一样

今天时间不够了,下次试验一下prepare statement会不会有类似问题,但估计得有


实例

建表:


触发器:


1级存储过程直接操作:


1级存储过程操作成功:


N+1级存储过程不声明:


N+1级存储过程调用失败:


N+1级存储过程声明临时表(此时,声明不需要列名,列数,以及类型匹配):


N+1级存储过程调用成功(可以看到,此时,不严格的声明,不会对临时表结果造成影响):
阅读(13527) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~