MySQL数据库服务器端的错误处理太弱了!_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 1949 | 回复: 0   主题: MySQL数据库服务器端的错误处理太弱了!        下一篇 
tngou
注册用户
等级:中校
经验:2433
发帖:192
精华:15
注册:2014-4-28
状态:离线
发送短消息息给tngou 加好友    发送短消息息给tngou 发消息
发表于: IP:您无权察看 2015-3-25 17:01:04 | [全部帖] [楼主帖] 楼主   主页

没有一种合适的方式来捕捉和诊断 MySQL 服务器端的错误,因此想知道什么地方出错了基本上是不可能的。

我们使用下面这样一个查询来证明这个结论:


1

INSERTINTOmy_table (my_column) VALUES(300);

这个查询可能发生什么错误?

  • 违反 UNIQUE KEY 约束

  • 违反 FOREIGN KEY 约束

  • my_column 字段类型可能是 TINYINT UNSIGNED, 而严格的 sql_mode 导致数值越界

  • 后者字段类型可能是某个枚举,如 ENUM (2,3,5,8)

还有可能是这样一些错误:

  • my_table 可能是一个只读的 MyISAM 表

  • 我们对 my_table 进行了锁表操作 LOCK TABLES my_table READ -- 违反了锁

  • 或者可能是一个 InnoDB 表,而 INSERT 可能导致死锁

  • 配置了 read_only=1 只读

  • 或者用户没法访问该表的权限

  • 或者表不存在

  • 也有可能是字段不存在

而且我还确定还可能有更多的错误原因存在。

现在,如果我写了一个 Java 程序,可能用了 Hibernate,那么我将会通过 SQLException 得到一个描述比较清晰的异常信息,我可以得知错误码和错误信息。

但在 MySQL 的服务器端,例如是存储过程呢?则不行!

再看看下面的代码:


1

2

3

4

5

6

CREATEPROCEDUREsome_procedure ()

BEGIN

DECLARECONTINUEHANDLER FORSQLEXCEPTION SET@error_found = 1;

INSERTINTOmy_table (my_column) VALUES(300);

IF @error_found THEN-- Any what error exactly is this? What's the message? END IF;

END;

如果我们希望为指定的错误执行相应的动作,我们需要:


1

2

3

4

5

DECLARECONTINUEHANDLER FOR1146 SET@error_found = 1146;

DECLARECONTINUEHANDLER FOR1147 SET@error_found = 1147;

DECLARECONTINUEHANDLER FOR1148 SET@error_found = 1148;

DECLARECONTINUEHANDLER FOR1149 SET@error_found = 1149;

...

但如果我们比知道将会发生什么错误,但仍希望记录这个错误,这样我们可能需要定义成百上千的 HANDLERs,尽管如此还是无法覆盖所有的错误情况。

5.5 版本不是引入了 SINGAL 和 RESIGNAL 了吗?

是的,的确是引入了,但对你毫无帮助,你可以重新 RESIGNAL 一个错误,但并不意味着错误实际发生时你能知晓。




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论