我将为初始化数据库的许多插入语句实现事务。我知道一个事务将允许我们将更改提交到数据库,从而保存它。或者,如果其中一个插入失败,我们可以回滚可能成功的所有插入。我的问题是,如何检测插入语句是否失败?
start transaction;
insert into ..
insert into ..
insert into ..
if (failure) roll back
else commit.
进一步解释,
我有一个sql脚本文件,我运行该文件将一堆数据插入到我的数据库中。我想围绕这些插入包装一个事务,以便在运行时,如果其中一个失败,那么我们会在执行任何插入之前回滚到初始状态。
答案 0 :(得分:1)
我希望在了解您正在使用的内容之后为您提供答案(请参阅我在您的问题下面的评论)。 但是,一般情况下,如果插入失败,您将收到来自MySQL的错误。 此外,通常,您应检查此故障,然后有条件地(如果收到失败消息)回滚。 这是一个类似的问题,答案是:Automatic Rollback if COMMIT TRANSACTION is not reached 此外,如果您正在使用存储过程,这是一个潜在的有价值的帖子(答案是): mysql transaction - roll back on any exception
更具体一点: 在PHP中,无论您使用什么方法进行查询(我建议使用PDO)都应该返回插入失败错误。检查此错误&如果收到它就会回滚。 例如您可以使用try 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
}
希望有所帮助。
答案 1 :(得分:0)
我认为最好的方法是将输出记录到文件中。登录MySQL时,键入
tee log.txt
脚本完成后,您可以检查该文件。
答案 2 :(得分:0)
mysql插入或任何dml查询返回一些内容以指示受影响的行数或任何生成的密钥。
http://dev.mysql.com/doc/refman/5.6/en/insert.html
即使在某些情况下,例如Insert Select,它也会返回一个描述字符串。所有驱动程序都能够检测到任何错误。 例如,在java中,您可以尝试
尝试{ 插入这里 在这里提交 }赶上(SQLEXCEPTION) { 回到这里 }
这取决于您将要使用的语言和驱动程序