mysql - MySQL 中的语句回滚与事务回滚

标签 mysql transactions locking

来自 MySQL docs我得到以下信息(关于错误代码):

  • 1205 (ER_LOCK_WAIT_TIMEOUT)

    Lock wait timeout expired. The statement that waited too long was rolled back (not the entire transaction). You can increase the value of the innodb_lock_wait_timeout configuration option if SQL statements should wait longer for other transactions to complete, or decrease it if too many long-running transactions are causing locking problems and reducing concurrency on a busy system.

在这条语句中,明确区分了语句回滚和事务回滚。我的问题是如何回滚一条语句,而其中运行的事务不回滚?更有什者,我在一个事务中得到这样的锁超时,整个事务被回滚。有人可以启发我吗?

最佳答案

与事务类似,语句也是原子的。一旦语句开始执行数据更改,就会保存原始状态(实际上会记录更改)。如果语句由于任何原因(超时、与刚提交的事务冲突)而失败,则更改必须恢复到原始状态。该语句将报告失败,但事务仍处于打开状态,您可以继续进行事务,就像语句从未执行过一样。

这其实类似于savepoint——你可以想象在每条statement savepoint被记录之前,statement完成之后,savepoint被commit。但是,这对外部事务或保存点没有影响。

关于mysql - MySQL 中的语句回滚与事务回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34924495/

相关文章:

ruby-on-rails - ruby on rails 是否在锁定事件记录时自动锁定事件记录关联?

sql - CHECKPOINT 的工作方式与 SQL 中的 COMMIT 相同吗?

Mysql - 在子查询中使用另一个查询的结果

php - Mysql 结果不存储在文件中

php - 如果我想用撇号的文本更新文本区域字段,htmlentities 是否会影响 htmlspecialchars?

java - Hibernate 为子类 dao 使用事务管理器

sql - 开始尝试在SQL Server 2005上捕获,如何将ERROR_stuff发送给调用的父级?

由 C# 锁定

Java 将显式锁与同步方法结合起来

c# - 通过 C# Windows 窗体程序连接 Raspberry PI 2 上的 MySql 数据库