gpt4 book ai didi

java - 当 MySQL 中的事务回滚()失败时会发生什么?

转载 作者:可可西里 更新时间:2023-11-01 06:30:17 25 4
gpt4 key购买 nike

try
{
Connection conn = ... MySQL connection ...;
conn.setAutoCommit(false); // transaction starts
.... do something ....
}
catch (MySQLException e)
{
try {
conn.rollback();
}
catch (Exception e)
{
// What happens now?
}
}

对于 MySQL 服务器(InnoDB 引擎),如果事务的 rollback() 失败会怎样? (即 在 rollback() 运行时网络立即中断 ,等等...)

这是否意味着数据库仍然损坏,或者 MySQL 服务器是否有任何方法可以从“未完成”的回滚中恢复?

最佳答案

Does it mean that DB remains corrupted

请注意,您的代码片段中的任何一点都没有损坏数据库。成为。它同时跟踪数据的原始状态和您在交易中所做的更改。

rollback() 引发的异常是为了客户端而非服务器的利益。尝试回滚时网络中断会触发异常,以便客户端可以尝试处理它,因为正常进行是没有用的。从服务器的角度来看,回滚是丢弃事务内容的明确指令。如果回滚命令从未到达数据库,数据库将简单地推迟提交更改,直到它决定不再需要更改,此时将清除更改以清理服务器中的内存或磁盘空间。

如果您以前没有见过它,您可能正在寻找术语 ACID ;这描述了必须如何设计数据库和其他并发系统以减轻此类故障。符合 ACID 的数据库旨在保持一致性,即使在提交或回滚的中途出现物理故障 - 提交更改(在数据库内部)的最后一步应该是原子的,以便它要么成功,要么被丢弃。


作为切线示例,Mercurial对于确保提交永不离开也有类似的担忧the repo处于不一致的状态。当用户提交更改时,需要将更新写入多个文件,其中任何一个写入都可能失败。因此,它以谨慎的顺序进行这些写入,以确保避免不一致。

  1. 首先,将各个文件差异附加到存储库中与其相关的 revlog 文件,并与变更集 ID 相关联。
  2. 然后更新列出这些更改的 list ,再次与更改集 ID 相关联。
  3. 只有在上述所有操作都成功后,变更集 ID 本身才会记录在变更日志中(这是一次原子写入)。如果写入成功,则提交成功。

如果 Mercurial 在 revlog 或 list 文件中遇到未知的变更集 ID,它会忽略它;从而确保更改要么完全提交,要么根本不提交。

我已经有一段时间没有仔细研究 Mercurial 的内部结构了,我完全有可能对其中的一些内容感到困惑,但要点是正确的。

关于java - 当 MySQL 中的事务回滚()失败时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29980996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com