我可以绕过MySQL中的当前事务吗?

我可以绕过MySQL中的当前事务吗?,mysql,transactions,innodb,Mysql,Transactions,Innodb,我有一些php代码,可以对InnoDB表执行关键更新 我正在使用选择。。。更新,所以我需要在事务内部 这段代码是在从表单发布数据时执行的,我有一个消息系统,以便错误/成功消息存储在数据库中,并在下次呈现页面时从数据库中提取 一些伪代码: 我正在使用我真正的代码中的try/catch块和转义 beginTransaction(); query("SELECT * FROM `table` WHERE id=1 FOR UPDATE"); $x=$_POST[$x]; query("UPDATE

我有一些php代码,可以对InnoDB表执行关键更新

我正在使用选择。。。更新,所以我需要在事务内部

这段代码是在从表单发布数据时执行的,我有一个消息系统,以便错误/成功消息存储在数据库中,并在下次呈现页面时从数据库中提取

一些伪代码: 我正在使用我真正的代码中的try/catch块和转义

beginTransaction();

query("SELECT * FROM `table` WHERE id=1 FOR UPDATE");

$x=$_POST[$x];
query("UPDATE `table` SET `field` = $X");

//add other data in the db related to $X
query("INSERT INTO `othertable` (x,y,x) VALUES (......)");


//check for various errors...
$erros=0

if ($error_condition_1) {
    messageSystem("Error Condition 1!")
    $errors+=1;
}
if ($error_condition_2) {
    messageSystem("Error Condition 2!")
    $errors+=1;
}

if ($errors) {
    rollBackTransaction();
} else {
    commitTransaction();
}
问题应该很明显:当messageSystem将错误存储在数据库中时,更改将在稍后回滚,用户将永远看不到错误消息

我可以看到两个简单的解决方案:

修改我的代码,以便在事务外部调用messageSystem。然而,如果我能像上面那样内联地写,它的可读性会更高,写起来也会更快。此外,如果这是可能已经在嵌套事务中的库代码,该怎么办? 修改messageSystem,使其使用自己与数据库的连接。但是,如果我使messageSystem更加复杂,并决定在向会话添加消息之前需要锁定会话表中的一个条目,该怎么办呢。如果我的主代码出于某种原因也锁定了会话,这可能会导致死锁。 在事务处理之前检查错误。但实际上,在验证输入之前,我需要通过选择“FOR UPDATE”锁定相关行。 所以我的问题是:当在一个可能嵌套的事务中时,是否有任何方法提交X,这样如果事务回滚,X无论如何都会被提交

或者,有没有什么好方法可以避免我所描述的问题


谢谢

简单的答案是使用第二个数据库连接来记录错误。

是的,这是我目前的解决方案,可能是最好的+1,但我真的想知道是否还有其他方法。你应该假设每个连接都有其特定的用途,这样事务隔离就可以正常工作。如果您出于不同的原因需要使用数据库,那么在这种情况下,使用另一个连接是正确的方法。但当它变得更复杂时会怎样?我已经有了一个从messages表到session表的外键约束,所以当会话结束时,剩余的消息会被删除。在执行上述代码期间,可以删除会话。我可以处理这个问题,但分离已经不是100%干净了。我对其他的答案感兴趣,这样我就可以在更复杂的场景中处理它,在这些场景中可能没有这么好的分离。抱歉这么长的评论。我倾向于使用一个调试类,该类有自己的数据库连接用于输出。我在调试的每个类中使用该类的一个实例,以便独立地写出其日志。它还允许我在文件调试和sql调试之间轻松切换,因为调用不必更改。不确定这是否有帮助。