SQL中的事务问题

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 在我看来,事务就好比“一根藤上的蚂蚱”、“一手交钱一手交货”,要么同生,要么同不在,同生共死的的一种状态。取款时后台扣了我的钱,那么我就要取到钱。

在日常生活中你们有没有遇到过这样的问题:我去银行取1000块钱,取款机也把我的余额减去了1000,可是取款机突然坏了,取款的口没吐出来钱,可是你的钱却已经扣了,这时怎么办?当然是找银行工作人员了,没错。当我们在涉及到价格或者一些借取情况时就常常要使用到“事务”这一概念。


一、概念


专业定义这么说的:在SQL中,事务是被绑定在一起作为一个逻辑工作单元的SQL语句分组。是不是很难懂?


在我看来,事务就好比“一根藤上的蚂蚱”、“一手交钱一手交货”,要么同生,要么同不在,同生共死的的一种状态。取款时后台扣了我的钱,那么我就要取到钱。


这也就牵扯出来了事务这一概念的特性!


二、4大特性


1.原子性(atomic):指事务中的操作要么全部完成,要么全部失败撤销


2. 一致性(consistency):指是我物种的操作都是在逻辑上正确的


3.隔离性(isolation):指多个事务之间不相互干扰,并发的事务之间要相互隔离


4.持久性(durability):指事务一旦提交,对数据库的操作就是永久性的


事务的思想其实就是利用事务的一些关键语句将多个SQL语句(比如:INSERT、UPDATE、DELETE)并发执行,要么一起成功,要么就全部失败。


”事务是恢复和并发控制的基本单位“所体现的正是这一思想


那么事务中有哪些关键语句呢?我这里着重讲述显式事务


三、语句


1.BEGIN TRANSACTION语句:开始执行事务


这条语句一般放在一个事务的开头(如果是显示事务),就是在告诉后面的SQL语句要结组开始工作了。


(如果使用的是隐式的,为了开始另外一个事务,必须结束前面的事务,需要运行一个COMMIT语句)


BEGIN TRANSACTION
显示事务


COMMIT 
BEGIN TRANSACTION
隐式事务


2.COMMIT TRANSACTION语句:提交事务

它使得自BEGIN TRANSACTION语句之后的所有SQL语句对数据库的修改写回到数据库中,事务正常结束。


如下图:INSERT语句和UPDATE语句修改之后执行COMMIT TRANSACTION语句,事务正常结束


20200221151627447.png


3.SAVE TRANSACTION语句:创建保存点(savepoint)

打个比方:在日常生活中,每隔相对一段距离就能看到一个公交站,当你上了车却发现做错站了,你只能下车重新更改路线,找寻与你的目的地想连接的站台。保存点就是这个这样:当我设了A和B两个保存点,如果我从保存点A到B这一节的SQL语句编写错误,系统就会自动将数据回滚到保存点A处。也正是因为保存点的设置,可以使我们不用‘从头再来’。你只需要将你错误的那一个点进行修改即可


20200221152654546.png


4.ROLLBACK TRANSACTION语句:回滚事务结束


使DBM是回滚或者撤销对数据库所作的某些或全部改变。如果添加ROLLBACK语句,ROLLBACK语句之前的所有被改变或者已经改变的数据都会恢复到数据开始的状态。就好比:”开弓没有回头箭“,但ROLLBACK就是这把回头箭


以上就是显式事务中的关键语句,是不是对事务有了一些了解呢?


那么我们现在在来思考一个问题:我们对数据库已经进行了事务的改变,那改变之前的数据我们还能不能看到呢?难道系统就自动删除了改变之前的数据了吗?


其实不是的,数据库中还存在这样一种机制:事务日志。


四、事务日志


使专门用来对数据操作之前内容和操作之后内容的一个保存的。所有的记录内容都写到一个独立的文件中。


日志通常保存在与主数据库不同的物理驱动器中,这样如果数据库驱动器发生了故障,则可以利用日志从上一次的备份点处恢复到当前的数据库。是不是很好用呢??


由于事务日志记录的改变,通常机器故障、掉电,或者其他的灾难对数据库具有较少或者不具有任何影响。事务日志都可以自动记录每个改变。并且在需要时使用这些日志文件回滚事务。


下面我来举一个实例来具体说明吧!


五、举例


现分别由客人信息表(MyTable)、房间状态信息表(State)两张表


MyTable

Id Name DateOfBirth Adress
1 贝拉 1999-08-07 CN
2 爱德华 1998-04-20 CN
3 秋月 1997-08-17 FA
4 雅各布 1998-11-28 USA


State

ID Inventory
1 Y
2 Y
3 Y
4 Y


现在3号房的秋月要退房,删除她的相关信息


COMMIT    //如果之前没有执行事务可不写
BEGIN TRANSACTION   //开始执行
UPDATE State        //更新State表Id为3房间的状态
SET Inventory = 'N'
WHERE State.Id = 3;
DELETE FROM MyTable      //删除MyTable表客户秋月的入住信息
WHERE MyTable.Name = '秋月';
COMMIT TRANSACTION    //提交事务


思维导图:


20200221164115184.png

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
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事件查看器以获取更多线索。
|
18天前
|
SQL Oracle 关系型数据库
[SQL]事务
本文介绍了事务处理的基本概念,包括事务的四大特性(原子性、一致性、隔离性、持久性)及生命周期。文章还详细解释了事务的保存点、四种事务隔离级别及其异常读现象,并提供了设置事务隔离级别的方法。最后,作者建议读者深入学习相关理论以更好地理解事务隔离级别。
43 0
|
2月前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
118 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
下一篇
无影云桌面