当前位置: 首页 > article >正文

SQL 自学:事务处理的COMMIT 和 ROLLBACK 语句的运用

在 SQL 中,事务处理是确保数据库操作的完整性和一致性的重要机制。事务可以看作是一组作为一个单元执行的数据库操作,要么全部成功提交(COMMIT),要么全部回滚(ROLLBACK)到事务开始之前的状态。

一、事务处理的概念

事务具有四个重要的特性,通常被称为 ACID 特性:

  • 原子性(Atomicity):事务中的所有操作要么全部成功执行,要么全部不执行。就好像一个不可分割的操作单元,不能只完成一部分。
  • 一致性(Consistency):事务执行的结果必须使数据库从一个一致性状态转变到另一个一致性状态。例如,在银行转账事务中,无论转账过程中发生什么,总金额必须保持不变。
  • 隔离性(Isolation):多个事务并发执行时,它们之间相互隔离,一个事务的执行不能被其他事务干扰。每个事务都感觉不到其他事务的存在。
  • 持久性(Durability):一旦事务被提交(COMMIT),其对数据库的更改就会永久保存下来,即使系统出现故障也不会丢失。

二、COMMIT 语句

COMMIT 语句用于将事务中所做的更改永久保存到数据库中。当执行了一系列的插入、更新或删除操作后,如果希望这些操作的结果被真正地应用到数据库中,就需要使用 COMMIT 语句。

例如,假设有一个银行账户表 accounts,包含 account_id(账户 ID)、balance(余额)等列。现在要从账户 1 向账户 2 转账 100 元。

BEGIN TRANSACTION;
-- 从账户 1 扣除 100 元
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- 向账户 2 增加 100 元
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT;

在上述代码中,首先使用 BEGIN TRANSACTION 开启一个事务。然后进行了两次更新操作,分别修改两个账户的余额。最后使用 COMMIT 语句将这些更改永久保存到数据库中。如果没有 COMMIT,那么这些更改在事务结束后会被自动回滚。

三、ROLLBACK 语句

ROLLBACK 语句用于撤销事务中所做的更改,将数据库恢复到事务开始之前的状态。

例如,还是上面的银行转账例子,如果在转账过程中出现了错误(比如账户 2 不存在),我们可以使用 ROLLBACK 来撤销操作:

BEGIN TRANSACTION;
-- 从账户 1 扣除 100 元
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- 假设发现账户 2 不存在,回滚操作
ROLLBACK;

在这个例子中,由于发现了错误,我们使用 ROLLBACK 语句撤销了从账户 1 扣除金额的操作,数据库中的余额将保持事务开始之前的状态。

再举一个例子,假设我们正在向一个表中插入多行数据,但是在插入过程中出现了异常。

BEGIN TRANSACTION;
INSERT INTO users (name, age) VALUES ('Alice', 25);
INSERT INTO users (name, age) VALUES ('Bob', 30);
-- 假设这里出现了错误,比如违反了唯一性约束
ROLLBACK;

 在这个例子中,如果第二个插入操作出现错误,ROLLBACK 会将第一个插入操作也撤销掉,就好像整个事务从未发生过一样。

四、事务处理的重要性

事务处理在实际的数据库应用中非常重要。例如,在金融交易、订单处理、库存管理等场景中,必须保证数据的一致性和完整性。如果没有事务处理,可能会出现数据不一致的情况,例如在银行转账中,钱从一个账户扣除了,但没有加到另一个账户上,这将导致严重的问题。

总之,通过合理使用 COMMIT 和 ROLLBACK 语句进行事务处理,我们可以确保数据库操作的正确性和可靠性,避免数据不一致和错误的发生。在编写 SQL 代码时,应该根据业务需求,谨慎地使用事务来保证数据的完整性和一致性。


http://www.kler.cn/a/349851.html

相关文章:

  • 指针的介绍3后
  • 《一文读懂!Q-learning状态-动作值函数的直观理解》
  • 三天急速通关JavaWeb基础知识:Day 1 后端基础知识
  • 编译dpdk19.08.2中example时一系列报错解决
  • 元素的显示与隐藏
  • 51单片机开发:独立键盘实验
  • PG 17 增量备份功能介绍
  • 等保测评实战:SQL Server数据库的安全评估
  • 弧度和角度
  • ARINC 429总线协议
  • Redis知识应用索引指南
  • 【LeetCode】动态规划—95. 不同的二叉搜索树 II(附完整Python/C++代码)
  • 数据特征工程:离散趋势指标分析
  • RAG(检索增强生成)面经(1)
  • 前端开发设计模式——命令模式
  • QT元对象系统特性详细介绍(信号槽、类型信息、动态设置属性)(注释)
  • Git Commit 规范
  • DBdoctor推出无Agent轻量级纳管解决方案
  • 低代码策略量化平台更新|大模型agents生态的一些思考
  • STM32F407 定时器实例解析
  • 录屏工具TOP10,探索你最爱的免费屏幕录制软件!
  • 华为OD机试真题-最佳种树距离-2024年OD统一考试(E卷)
  • Spring Boot:中小型医院网站的性能优化
  • 谈谈我的理解:引用计数 vs 可达性分析
  • 静态路由、动态路由以及默认路由
  • 【计算机网络篇】数据链路层 协议、介质访问控制