SQL基础知识V2——事务

简介: SQL数据库开发

什么是事务

事务是在数据库上按照一定的逻辑顺序执行的任务序列,既可以由用户手动执行,也可以由某种数据库程序自动执行。

事务实际上就是对数据库的一个或者多个更改。当你在某张表上创建更新或者删除记录的时,你就已经在使用事务了。控制事务以保证数据完整性,并对数据库错误做出处理,对数据库来说非常重要。

实践中,通常会将很多 SQL 查询组合在一起,并将其作为某个事务一部分来执行。


事务的属性

事务具有以下四个标准属性,通常用缩略词 ACID 来表示:

原子性:保证任务中的所有操作都执行完毕;否则,事务会在出现错误时终止,并回滚之前所有操作到原始状态。

一致性:如果事务成功执行,则数据库的状态得到了进行了正确的转变。

隔离性:保证不同的事务相互独立、透明地执行。

持久性:即使出现系统故障,之前成功执行的事务的结果也会持久存在。


事务控制

有四个命令用于控制事务:

COMMIT:提交更改;

ROLLBACK:回滚更改;

SAVE:在事务内部创建一系列可以 ROLLBACK 的还原点;

SET TRANSACTION:命名事务;


COMMIT 命令

COMMIT 命令用于保存事务对数据库所做的更改。

COMMIT 命令会将自上次 COMMIT 命令或者 ROLLBACK 命令执行以来所有的事务都保存到数据库中。

COMMIT 命令的语法如下所示:

COMMIT;


COMMIT事务实例

考虑 Customers表,表中的记录如下所示:

80.jpg

下面的示例将会删除表中姓名为"张三"的记录,然后将更改提交(COMMIT)到数据库中。

BEGIN TRANSACTION
DELETE FROM customers_bak WHERE 姓名='张三'
COMMIT;

上述语句将会从表中删除一行记录,再执行 SELECT 语句将会得到如下结果:

81.jpg

注意:SQL Server默认会自动提交事务,要取消自动提交事务可以执行如下操作,在SSMS中的菜单栏中选择【工具】——【选项】——【查询执行】——【ANSI】在界面右边勾选上SET IMPLICIT_TRANSACTIONS,如下图:

82.jpg


设置完后需重新启动SMSS方可生效。


ROLLBACK 命令

ROLLBACK 命令用于撤销尚未保存到数据库中的事务。

ROLLBACK 命令只能撤销自上次 COMMIT 命令或者 ROLLBACK 命令执行以来的事务。

ROLLBACK 命令的语法如下所示:

ROLLBACK;


ROLLBACK示例

考虑 Customers表,表中的记录如下所示:

83.jpg

下面的示例将会从表中删除城市为"广州"的记录,然后回滚(ROLLBACK)对数据库所做的更改。

BEGIN TRANSACTION
DELETE FROM Customers WHERE 城市='广州'
ROLLBACK;

结果是删除操作并不会对数据库产生影响。现在,执行 SELECT 语句将会得到如下结果:

84.jpg

SAVE命令

SAVE 是事务中的一个状态点,使得我们可以将事务回滚至特定的点,而不是将整个事务都撤销。

SAVE 命令的记录如下所示:

SAVE TRANSACTION SAVE_NAME;

该命令只能在事务语句之间创建保存点(SAVE)。ROLLBACK 命令可以用于撤销一系列的事务。

回滚至某一保存点的语法如下所示:

ROLLBACK TRANSACTION SAVE_NAME

下面的示例中,你计划从 Customers表中删除三条不同的记录,并在每次删除之前创建一个保存点(SAVE),从而使得你可以在任何任何时候回滚到任意的保存点,以恢复数据至其原始状态。

注意:Oracle和Mysql的保存点语法与上述不同,语法为

SVAEPOINT SAVEPOINT_NAME


SAVE示例

考虑 Customers 表,表中的记录如下所示:

85.jpg

操作序列如下所示:

BEGIN TRANSACTION
SAVE TRANSACTION SP1
DELETE FROM Customers WHERE 姓名='张三'
SAVE TRANSACTION SP2
DELETE FROM Customers WHERE 姓名='李四'
SAVE TRANSACTION SP3
DELETE FROM Customers WHERE 姓名='王五'

现在,三次删除操作已经生效了,如果此时你改变主意决定回滚至名字为 SP2 的保存点,由于 SP2 于第一次删除操作之后创建,所以后两次删除操作将会被撤销。

ROLLBACK TRANSACTION SP2
COMMIT;

注意,由于你将数据库回滚至 SP2,所以只有第一次删除真正起效了:

86.jpg

SET TRANSACTION 命令

SET TRANSACTION 命令可以用来初始化数据库事务,指定随后的事务的各种特征。

例如,你可以将某个事务指定为只读或者读写。

SET TRANSACTION 命令的语法如下所示:

SET TRANSACTION [ READ WRITE | READ ONLY ];


批注

事务在SQL应用中很广泛,特别是针对一些读写问题时,使用事务可以很好的规避意外(脏读,幻读,不可重复读)。而且事务在出来误操作时也有很好的预防作用,特别是像SQL Server这种自动提交的数据库平台,使用事务能防止误删和误更新。

相关文章
|
6月前
|
SQL 存储 数据库
sql事务、视图和索引
sql事务、视图和索引
|
3月前
|
SQL 数据库 数据安全/隐私保护
SQL Server数据库Owner导致事务复制log reader job无法启动的解决办法
【8月更文挑战第14天】解决SQL Server事务复制Log Reader作业因数据库所有者问题无法启动的方法:首先验证数据库所有者是否有效并具足够权限;若非,使用`ALTER AUTHORIZATION`更改为有效登录名。其次,确认Log Reader使用的登录名拥有读取事务日志所需的角色权限。还需检查复制配置是否准确无误,并验证Log Reader代理的连接信息及参数。重启SQL Server Agent服务或手动启动Log Reader作业亦可能解决问题。最后,审查SQL Server错误日志及Windows事件查看器以获取更多线索。
|
17天前
|
SQL Oracle 关系型数据库
[SQL]事务
本文介绍了事务处理的基本概念,包括事务的四大特性(原子性、一致性、隔离性、持久性)及生命周期。文章还详细解释了事务的保存点、四种事务隔离级别及其异常读现象,并提供了设置事务隔离级别的方法。最后,作者建议读者深入学习相关理论以更好地理解事务隔离级别。
40 0
|
2月前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
116 0
|
3月前
|
SQL 监控 供应链
|
3月前
|
SQL 关系型数据库 MySQL
SQL Server 事务执行、回滚
SQL Server 事务执行、回滚
47 0
|
5月前
|
SQL 数据库 索引
SQL中如何实现事务?
【6月更文挑战第17天】SQL中如何实现事务?
50 2
|
5月前
|
SQL 关系型数据库 MySQL
MySQL数据库——基础篇总结(概述、SQL、函数、约束、多表查询、事务)一
MySQL数据库——基础篇总结(概述、SQL、函数、约束、多表查询、事务)一
47 5
|
5月前
|
SQL 存储 关系型数据库
Mysql-事务-锁-索引-sql优化-隔离级别
Mysql-事务-锁-索引-sql优化-隔离级别
|
5月前
|
SQL 存储 关系型数据库
MySQL数据库——基础篇总结(概述、SQL、函数、约束、多表查询、事务)二
MySQL数据库——基础篇总结(概述、SQL、函数、约束、多表查询、事务)二
45 0