首页 > 数据库 >SQL中的事务问题

SQL中的事务问题

时间:2022-12-26 19:00:36浏览次数:47  
标签:语句 事务 TRANSACTION 数据库 问题 SQL 日志


在日常生活中你们有没有遇到过这样的问题:我去银行取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语句,事务正常结束

SQL中的事务问题_数据

 

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

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

SQL中的事务问题_SQL_02

 

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 //提交事务

 

思维导图:

SQL中的事务问题_SQL_03

 

  

标签:语句,事务,TRANSACTION,数据库,问题,SQL,日志
From: https://blog.51cto.com/u_15921176/5970413

相关文章

  • SQL视图
    【前言】通常我们在数据库中查询数据时用的是SELECT语句,我们可以用SELECT语句查询任何数据库中的信息,只要数据库有,只要你要。利用SELECT语句,你可以将一个个表通过一些特定的......
  • SQL外部联合:right outer join、left outer join、full outer join
    SQL将外部联合分为了右外部联合(rightouterjoin)、左外部联合(leftouterjoin)、完全外部联合(fullouterjoin)3个类型。 左外部联合:LEFTOUTERJOIN      ......
  • 16、SQL操作JSON字段
    Mysql5.7版本以后提供一个原生的Json类型,Json值将不再以字符串的形式存储,而是采用一种允许快速读取文本元素(documentelements)的内部二进制(internalbinary)格式。一、Mysq......
  • poi pdf 转word 中文不显示问题
    出错原因每一列没设置字体代码生成wordpublicstaticStringFILE_SRC="templates/xxx.docx";publicXWPFDocumentsearchAndReplace(Map<String,Strin......
  • 10、sqli-labs(盲注8-10)
    环境sqli-labsless8一、通过判断是单引号闭合http://192.168.1.119/sqli/Less-8/?id=1’--+二、我们查询一下数据库有多少字节http://192.168.1.119/sqli/Less-8/?id=1......
  • 1,权限问题:无法创建目录"**": 权限不够":
    1,权限问题:无法创建目录"**":权限不够":解决:在命令前加上sudo命令后,输入密码即可原创建目录命令:mkdir[选项]DirName解决权限问题时的命令:sudomidir[选项] DirName......
  • 关系型数据库学习手记——初见倾心PostgreSQL、MySQL、SQLite、MongoDB
    一、关系型数据库系统理论知识1.1学习笔记​​数据库系统概念读书笔记-引言​​数据库系统概念读书笔记-关系数据库数据库系统概念读书笔记-数据库发展史(上)数据库系统概念......
  • JavaScript 中0.1+0.2 不等于 0.3 的问题
    在JavaScript中,有时候你可能会发现0.1+0.2不等于0.3。这是因为JavaScript使用的是浮点数来表示小数,而浮点数在计算机内部是用二进制表示的,这导致了一些精度问题。......
  • 03.关于线程你必须知道的8个问题(中)
    大家好,我是王有志。原计划是今天结束线程的部分,但是写完后才发现,光Thread类的核心方法分析就写了5000多字了,所以不得不再拆出来一篇。在02.关于线程你必须知道的8个问题(......
  • MySQL半一致读实验
    参考资料:https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.htmlhttps://www.yisu.com/zixun/262123.html1、实验环境MySQL5.7RC隔离......