SQL命令之“事务”简介

简介: 前言目前为止我们已经学习了有一定数量的sql命令和sql语言的概念了。那么在实际使用过程中,这些语句是一句一句按顺序执行的吗?sql语言也有主流编程语言一样的“顺序结构、循环结构、分支结构”这么一说吗?其实在实际的业务当中,sql语言可能不会像编程语言那样有三类明显的语句结构。但是sql中语句语句之间的关系必然也是有的,想象一下银行的转账操作,一个账户扣款和另一个账户的进账必须看作一个整体,少哪个步骤都会造成严重的后果。这就是sql语言的事务——

前言


目前为止我们已经学习了有一定数量的sql命令和sql语言的概念了。

那么在实际使用过程中,这些语句是一句一句按顺序执行的吗?sql语言也有主流编程语言一样的“顺序结构、循环结构、分支结构”这么一说吗?

其实在实际的业务当中,sql语言可能不会像编程语言那样有三类明显的语句结构。

但是sql中语句语句之间的关系必然也是有的,想象一下银行的转账操作,一个账户扣款和另一个账户的进账必须看作一个整体,少哪个步骤都会造成严重的后果。

这就是sql语言的事务——


事务的概念


多条语句作为一个整体进行操作的功能,称为数据库事务。一个事务可以确保在这事务范围内的所有操作只能全部成功或者全部失败,如果事务中任何语句执行失败,则之前执行的命令也全部撤销,效果等同于没有执行这整个事务的所有语句。

我们来看看上面提到的汇款过程:

update acc set money=money-100
where id=001;
update acc set money=money+100
where id=002;
复制代码

我们用update命令改变数据库指定记录的数据,第一条(前两行)扣款,第二条(后两行)入账。如果按照传统的命令一条条执行的话,一旦在扣款完成后,入账过程出错(比如查找不到id为002的记录),那这100块就永远从流通中消失了(实际存在银行里的财富没有少,100块可能被当作银行吞钱),错误一多,就带来了严重的责任事故。

而用事务就不一样了,哪怕第二条语句出错,第一条语句也会撤销,相当于转账失败,至少双方没有财富损失


数据库事务的特性


普遍认为,数据库的事务具有以下4个特性。用商科常见的首字母简拼法,就是ACID:

  • Atomic原子性。事务中的所有sql语句作为原子单元执行,要么全部成功,要么全部不执行
  • Consistent一致性,事务完成后,所有状态一致(也可以理解成数据库完整性约束没有被破坏)。这个“状态一致”比较抽象,其实这个概念和具体应用场景有关,比如上面提到的汇款,汇款后,001加了100块,002收入100块,和汇款前总额是不变的。
  • Isolation隔离性,多个事务并发执行时,每个事务作出的修改必须与其他事务隔离。详细来说就是,不同事务在中间过程对同一个数据进行操作时,每个事务有各自完整的数据空间,他们的修改都是彼此隔离的,不会相互影响
  • Duration持久性,事务完成后,对数据库的修改会被持久化储存。即事务完成后不会再出现回滚情况,即便系统故障也能在重启后恢复事务成功后的状态。(懂电脑的人都知道内存和硬盘的区别吧?这里可以类比一下)


隐式事务和显式事务


其实仔细一想,一条完整的sql语句好像就是一个事务。他满足事务的所有特性。

的确,对于单条事务,数据库系统会自动将其作为事务执行。一条语句的事务被称为“隐式事务”

而我们前面提到的多条语句组成的事务该如何设置呢?我们可以使用begin&commit包裹着代码块进行声明:

begin;
update acc set money=money-100
where id=001;
update acc set money=money+100
where id=002;
commit;
复制代码

如上,我们这样就完成了一个代码块的事务声明(也可以说是一个事务的提交,毕竟是commit,看你怎么理解了)。当然,这样包含多条语句的事务叫做 “显式事务”

顾名思义,commit后,这个事务的结果就被永久保存了,除非我们有别的命令去修改,不然他不会回滚到以前的状态了。如果我们希望某个事务失败并回滚,可以使用rollback命令替换commit

begin;
update acc set money=money-100
where id=001;
update acc set money=money+100
where id=002;
rollback;
复制代码

这样整个事务就失败,并回到之前的状态了。

相关文章
|
2月前
|
SQL 存储 数据库
sql事务、视图和索引
sql事务、视图和索引
16 0
|
3月前
|
SQL 关系型数据库 MySQL
MySQL技能完整学习列表3、SQL语言基础——1、SQL(Structured Query Language)简介——2、基本SQL语句:SELECT、INSERT、UPDATE、DELETE
MySQL技能完整学习列表3、SQL语言基础——1、SQL(Structured Query Language)简介——2、基本SQL语句:SELECT、INSERT、UPDATE、DELETE
56 0
|
7天前
|
机器学习/深度学习
T-sql 各种查询命令
T-sql 各种查询命令
|
21天前
|
SQL XML 数据库
sql导入数据库命令
在SQL Server中,数据库导入可通过多种方式实现:1) 使用SSMS的“导入数据”向导从各种源(如Excel、CSV)导入;2) BULK INSERT语句适用于导入文本文件;3) bcp命令行工具进行批量数据交换;4) OPENROWSET函数直接从外部数据源(如Excel)插入数据。在操作前,请记得备份数据库,并可能需对数据进行预处理以符合SQL Server要求。注意不同方法可能依版本和配置而异。
|
25天前
|
SQL Oracle 关系型数据库
Oracle SQL*Plus的TTITLE和BTITLE命令:为你的数据报告加上精美的“画框”
【4月更文挑战第19天】`SQL*Plus`的`TTITLE`和`BTITLE`命令用于为数据报告添加吸引人的标题和边框。
|
25天前
|
SQL Oracle 关系型数据库
Oracle SQL*Plus的COLUMN命令:数据展示的“化妆师”
【4月更文挑战第19天】Oracle SQL*Plus的COLUMN命令是数据展示的利器,能美化和格式化输出。它可定制列标题、调整显示格式(如数字的小数位数和日期格式),添加前缀和后缀(如货币符号),以及控制列宽和是否折行,使得数据呈现更直观、专业。利用COLUMN命令,能将原始数据转化为易于理解和视觉吸引力强的展示形式。
|
25天前
|
SQL Oracle 关系型数据库
Oracle SQL*Plus的SPOOL命令:数据库世界的“录像机”
【4月更文挑战第19天】`SQL*Plus`的`SPOOL`命令是Oracle数据库中的“录像机”,能记录所有操作和输出。它在用户开始“SPOOL ON”时启动,记录SQL查询、输出、错误信息等。完成后,“SPOOL OFF”停止记录并生成日志文件,便于回顾和检查。日志文件可自定义保存位置和命名,支持多文件录制,方便分类管理。无论数据分析、SQL脚本编写还是日常维护,`SPOOL`都是强大的工具,值得一试!
|
25天前
|
SQL Oracle 关系型数据库
Oracle SQL*Plus的DESCRIBE命令:数据结构的“侦探”
【4月更文挑战第19天】`DESCRIBE`命令是Oracle SQL*Plus中的明星工具,用于快速揭示数据结构。它能显示表或视图的列名、数据类型、长度和空值限制,帮助用户理解数据库对象详情。此命令对数据库设计、查询优化和故障排除至关重要,且支持描述视图和同义词。通过有效利用DESCRIBE提供的信息,可以提升SQL查询效率,优化表结构,成为数据管理的得力助手。
|
25天前
|
SQL Oracle 关系型数据库
Oracle SQL*Plus的HELP命令:你的数据库“百事通”
【4月更文挑战第19天】`Oracle SQL*Plus` 的 `HELP` 命令是数据库查询的强大工具,犹如“百事通”。在遇到困惑时,`HELP` 可提供详细命令解释和用法示例,解答基础到高级的 SQL 和 PL/SQL 疑问。它还是“活字典”,揭示命令关联与区别,如 `SET` 和 `ALTER SESSION`。此外,`HELP` 解释数据库概念,如“事务”,并支持模糊查询。无论新手还是专家,`HELP` 都是数据库探索的得力助手。
|
25天前
|
SQL Oracle 关系型数据库
Oracle SQL*Plus的SET命令:你的数据库会话“调色板”
【4月更文挑战第19天】Oracle SQL*Plus的SET命令是数据库会话的“调色板”,用于设置输出格式、反馈信息和各种偏好。它能调整PAGESIZE和LINESIZE以优化显示,控制ECHO和FEEDBACK开关以定制反馈,以及统计命令执行时间(TIMING)和调试SQL(VERIFY)。更高级的选项如HEADING和COLSEP可改善输出的可读性。通过灵活运用SET命令,能提升工作效率和体验,是数据库管理员和开发者的必备工具。