Mysql存储过程(一)——原子性

来源:互联网 发布:网络视听许可证 编辑:程序博客网 时间:2024/05/01 02:28

Mysql中,单个Store Procedure(SP)不是原子操作,而oracle则是原子的。如下的存储过程,即使语句2失败,语句1仍然会被commit到数据库中:

Sql code 1-1

要使整个存储过程成为一个原子操作的办法是:在存储过程主体开始部分,指定开始一个事务。语句2失败,语句1不会被commit到数据库中,存储过程将会在调用时抛出一个异常。

Sql code 1-2

 在指定了整个存储过程作为一个事务的情况下,最后必须要主动commit或者rollback以结束该事务,如下的代码,如果缺少语句1,最终也是不会被commit到数据库中的。

Sql code 1-3:

 还有一个比较诡异的地方,就是,如果在存储过程中commit了,接下来的语句就均变成非事务控制的了,如下代码,在语句1commit,接下来语句2成功,但是语句3和语句2PK是一样,整个存储过程应该抛PK重复的异常。而执行后发现,语句2的结果被正常commit到数据库中了,而语句3抛出一个异常:

Sql code 1-4:

 如果要想Sql code 1-4中的语句2和语句3作为一个整体,则需要再重新启用一个事务,如下代码,这样,调用的时候,语句1可以正常commit,语句3出错,存储过程会抛异常而不会把语句2的执行结果commit到数据库:

Sql code 1-5: