2014-05-14 25 views
0

我打算为我初始化数据库的许多插入语句实现事务。我知道一个事务将允许我们将更改提交到数据库,从而保存它。或者,如果其中一个插入失败,我们可以回滚所有可能成功的插入。我的问题是,如何检测插入语句是否失败?如何检测插入过程中是否发生错误?

start transaction; 
insert into .. 
insert into .. 
insert into .. 
if (failure) roll back 
else commit. 

进一步解释,

我有我跑插入一组数据到我的数据库的SQL脚本文件。我想围绕这些插入包装事务,以便在运行时,如果其中一个失败,那么在执行任何插入操作之前,我们会回滚到初始状态。

+0

您检查每个插入查询的单个结果。例如如果您是从某些客户端应用程序执行此操作,例如PHP,你会检查插入查询的返回值。如果没关系,那么你做另一个插入,等等......一旦完成插入,你做提交。 –

+0

你在做什么?我的意思是这些存储过程在MySQL本身? 这是一些连接到数据库的外部应用程序(就像Marc B问......是这个PHP?)。 – MER

+0

我正在MySQL工作台上工作 –

回答

1

我更愿意在了解更多关于您正在使用的内容之后为您提供答案(请参阅您的问题下面的我的评论)。 但是,一般来说,如果插入失败,您将收到来自MySQL的错误。 另外,一般来说,您应该检查此故障,然后有条件地(如果您收到故障消息)回滚。 这里是一个答案类似的问题:Automatic Rollback if COMMIT TRANSACTION is not reached 另外,如果您正在使用存储过程在这里工作是一个潜在的有价值的帖子(当然答案是): mysql transaction - roll back on any exception

更具体: 在PHP中任何你正在使用查询(我推荐PDO)应该返回插入失败错误。如果收到此错误,请检查此错误&回滚。 例如您可以使用try catch异常处理构造& catch来获取PDO特定的错误,如果您收到此错误,则可以在catch中触发回滚。

catch(PDOException $e) 
    { 
     echo 'Caught exception: ', $e->getMessage(), "\n"; 
    //verify that it was an insert failure then rollback or just plain rollback becuase you received an error 
    } 

希望有帮助。

+0

使用存储过程的链接正是我所需要的。非常感谢你! –

+0

对不起,我很高兴我能够帮助:) – MER

0

我认为最好的方法是将输出记录到文件中。当您登录到MySQL时,输入

tee log.txt 

脚本结束后,您可以检查该文件。

0

mysql插入或任何dml查询返回的东西,以指示受影响的行数或任何生成的密钥。

http://dev.mysql.com/doc/refman/5.6/en/insert.html

甚至在某些情况下,像插入选择它返回一个描述字符串。所有驱动程序都能够检测到任何错误。 例如,在Java中,你可以尝试

尝试{这里 插入 这里提交 }赶上(SQLEXCEPTION) { 回滚这里 }

这取决于语言和驱动程序,您要使用

相关问题