MySQL 事务2025年3月17日 | 阅读 7 分钟 MySQL 中的事务是一系列语句、查询或操作(如 select、insert、update 或 delete)作为一个单一工作单元执行,可以提交或回滚。如果事务对数据库进行了多次修改,会发生以下两件事:
换句话说,一个事务必须完成集合中的每一个操作才能算成功。这意味着如果任何一个语句失败,事务操作都无法产生结果。 MySQL 中的事务从第一个可执行的 SQL 语句开始,并在遇到显式或隐式的 COMMIT 或 ROLLBACK 时结束。显式使用 COMMIT 或 ROLLBACK 语句,隐式则在使用 DDL 语句时。 让我们通过以下解释来理解事务的概念。 我们可以通过考虑一个银行数据库来理解 MySQL 中事务的概念。假设一位银行客户想将资金从一个账户转到另一个账户。我们可以通过使用将分为以下几个步骤的 SQL 语句来实现:
事务的属性事务主要包含四个属性,通常称为ACID属性。现在,我们将详细讨论 ACID 属性。ACID 属性代表:
原子性 (Atomicity):此属性确保事务单元中的所有语句或操作都必须成功执行。否则,如果任何操作失败,整个事务将中止,并回滚到其之前的状态。它包含以下功能:
一致性 (Consistency):此属性确保数据库仅在事务成功提交后才更改状态。它还负责保护数据免受崩溃。它包含以下功能:
隔离性 (Isolation):此属性保证事务单元中的每个操作都独立运行。它还确保语句之间是透明的。它包含以下功能:
持久性 (Durability):此属性保证已提交事务的结果会永久保存,即使系统崩溃或失败。它包含以下功能:
MySQL 事务语句MySQL 使用以下语句来控制事务:
再次,使用以下语句启用自动提交模式: MySQL 事务示例假设我们有两个名为 "employees" 和 "Orders" 的表,其中包含以下数据: 表:employees ![]() 表:orders ![]() COMMIT 示例如果我们想使用事务,则需要将 SQL 语句分解为逻辑部分。之后,我们可以决定是提交还是回滚数据。 以下步骤说明了如何创建事务:
以下是执行上述操作的命令: 下图更清晰地说明了这一点: ![]() ROLLBACK 示例我们可以通过以下说明来理解回滚事务。首先,打开 MySQL 命令行提示符并使用密码登录到数据库服务器。接下来,我们需要选择一个数据库。 假设我们的数据库包含 "Orders" 表。现在,以下是执行回滚操作的脚本: 执行上述语句后,我们将得到如下输出,显示 Orders 表中的所有记录都已成功删除。 ![]() 现在,我们需要打开一个单独的 MySQL 数据库服务器会话,并执行以下语句来验证 Orders 表中的数据: 这将产生如下输出: ![]() 尽管我们在第一个会话中进行了更改,但我们仍然可以看到表中存在记录。这是因为在第一个会话中执行 COMMIT 或 ROLLBACK 语句之前,更改并非永久性的。 因此,如果我们想使更改永久化,请使用 COMMIT 语句。否则,请执行 ROLLBACK 语句以回滚第一个会话中的更改。 成功执行后,将产生以下结果,我们可以看到更改已被回滚。 ![]() 在 MySQL 事务中无法回滚的语句。 MySQL 事务无法回滚所有语句。例如,这些语句包括 DDL(数据定义语言)命令,如 CREATE、ALTER 或 DROP 数据库,以及 CREATE、UPDATE 或 DROP 表或存储例程。我们在设计事务时必须确保不包含这些语句。 SAVEPOINT、ROLLBACK TO SAVEPOINT、RELEASE SAVEPOINTSAVEPOINT 语句在事务内部创建一个带有标识符名称的特殊标记。它允许回滚在 savepoint 之后执行的所有语句。因此,事务将恢复到它在 savepoint 时所处的状态。如果我们为当前事务设置了多个同名 savepoint,则新的 savepoint 负责回滚。 ROLLBACK TO SAVEPOINT 语句允许我们在不中止事务的情况下回滚到已建立的给定 savepoint 的所有事务。 RELEASE SAVEPOINT 语句会销毁当前事务中的命名 savepoint,而不会撤消在建立 savepoint 后执行的查询所产生的影响。在此之后,不再发生回滚命令。如果 savepoint 不存在于事务中,则会报错。 以下是 MySQL 事务中上述语句的语法: 示例让我们通过示例来理解如何使用这些语句。在下面的示例中,我们将使用 SAVEPOINT 和 ROLLBACK TO SAVEPOINT 语句,它们解释了 savepoint 如何确定当前事务中哪些记录可以被回滚。 在上面:
下面的输出按顺序解释了上述步骤,这有助于非常容易地理解它。 ![]() 现在,我们将使用 SELECT 语句来验证上述操作。在输出中,我们可以看到 order_id=6 和 order_id=8 已成功添加,但 order_id=7 未插入表中。它回滚了在建立 savepoint 后输入的值。 ![]() 现在我们将使用另一个示例 RELEASE SAVEPOINT,它建立 my_savepoint 然后删除一个 savepoint。 在输出中,我们可以看到事务中的所有语句都已成功执行。在这里,INSERT 和 UPDATE 语句都在 COMMIT 时修改了表。 ![]() 下一主题MySQL 分区 |
我们请求您订阅我们的新闻通讯以获取最新更新。