数据库事务 | 青训营笔记

128 阅读8分钟

事务

1.事务 :

事务是用户定义的一个操作序列,这些序列要么全做,要么一个不做,是一个不可分割的工作单位,是数据库环境中的逻辑工作单位。

• 事务的特性 ACID

原子性:工作基本单位,要么全做,要么不做

一致性:必须从一个一致性状态变成另一个一致性状态,不能只操作一部分

隔离性:一个事务的执行不能受到其他事务的干扰

持续性:一个事务的提交对数据库影响是永久的

A:原子性 说明事务是最小的工作单元。不可再分。

C:一致性 所有事务要求,在同一个事务当中,所有操作必须同时成功,或者同时失败, 以保证数据的一致性。

I:隔离性 A事务和B事务之间具有一定的隔离。 教室A和教室B之间有一道墙,这道墙就是隔离性。 A事务在操作一张表的时候,另一个事务B也操作这张表会那样???

D:持久性 事务最终结束的一个保障。事务提交,就相当于将没有保存到硬盘上的数据 保存到硬盘上!

了解一下:事务与原语:

所谓原语,一般是指由若干条指令组成的程序段,用来实现某个特定功能,在执行过程中不可被中断。可以把原语理解为一条指令。 事务,一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元。事务通常由高级数据库操纵语言或编程语言书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。 原语本身只强调原子性;事务则在强调原子性外,还强调一致性、隔离性、持久性。 原语的抽象层次更高,我们可以把事务看作是一种原语。

2.隔离四个等级以及问题

读未提交:事务A可以读取到事务B未提交的数据。脏读现象!

读已提交:事务A只能读取到事务B提交之后的数据。不可重复读。

可重复读:事务A开启之后,不管是多久,每一次在事务A中读取到的数据都是一致的。幻影读

串行化:不能并发,事务依次排队。

A教室和B教室中间有一道墙,这道墙可以很厚,也可以很薄。这就是事务的隔离级别。
这道墙越厚,表示隔离级别就越高。
​
事务和事务之间的隔离级别有哪些呢?4个级别
​
    1.读未提交:read uncommitted(最低的隔离级别)《没有提交就读到了》
        什么是读未提交?
            事务A可以读取到事务B未提交的数据。
        这种隔离级别存在的问题就是:
            脏读现象!(Dirty Read)
            我们称读到了脏数据。
        这种隔离级别一般都是理论上的,大多数的数据库隔离级别都是二档起步!
​
    2.读已提交:read committed《提交之后才能读到》
        什么是读已提交?
            事务A只能读取到事务B提交之后的数据。
        这种隔离级别解决了什么问题?
            解决了脏读的现象。
        这种隔离级别存在什么问题?
            不可重复读取数据。
            什么是不可重复读取数据呢?
                在事务A开启之后,第一次读到的数据是3条,当前事务A还没有结束,可能第二次再读取的时候,此时若事务B已提交,读到的数据是4条,3不等于4称为不可重复读取。
​
        这种隔离级别是比较真实的数据,每一次读到的数据是绝对的真实。
        oracle数据库默认的隔离级别是:read committed
​
    3.可重复读:repeatable read《提交之后也读不到,永远读取的都是刚开启事务时的数据》
        什么是可重复读取?
            事务A开启之后,不管是多久,每一次在事务A中读取到的数据都是一致的。即使事务B将数据已经修改,并且提交了,事务A读取到的数据还是没有发生改变,这就是可重复读。
        可重复读解决了什么问题?
            解决了不可重复读取数据。
        可重复读存在的问题是什么?
            可以会出现幻影读。
            每一次读取到的数据都是幻象。不够真实!
        
        早晨9点开始开启了事务,只要事务不结束,到晚上9点,读到的数据还是那样!
        读到的是假象。不够绝对的真实。
​
        mysql中默认的事务隔离级别就是这个!!!!!!!!!!!
​
    4.序列化/串行化:serializable(最高的隔离级别)
        这是最高隔离级别,效率最低。解决了所有的问题。
        这种隔离级别表示事务排队,不能并发!
        synchronized,线程同步(事务同步)
        每一次读取到的数据都是最真实的,并且效率是最低的。

3.三个并发问题

丢失修改: 事务 T1,T2 同时读取和修改数据库的某一属性的值,事务 T2 破坏了 T1 的修改结果,导致 T1 修改被丢失

不可重复读:事务 T1 从数据库中读取操作,T2 更新数据库,T1 无法再现前一次读取的结果。

读脏数据: 事务 T1 读取并修改操作但是还未提交,T2 读取了该数据,那么读取的是脏数据

(幻读:事务部独立执行时候发生的一种现象。比如事务1 读取修改了全部数据行,事务2 向表中插入新的一行,事务1 发现表中海油未处理的数据行,像发生幻觉一样,解决方法:增加范围锁)

4.三种封锁协议:

一级:事务 T 在修改数据 R 之前加 X 锁,直到事务结束

二级:事务 T 在修改数据 R 之前加 X 锁,直到事务结束 ; 事务 T 在读取数据之前加 S 锁,直到事务结束;

三级:事务 T 在修改数据 R 之前加 X 锁,事务 T 在读取数据之前加 S 锁,直到事务结束释放所有锁

S锁是共享锁:事务1加S锁,事务1只能读取操作,其他事务也可以且只可以加S锁

X锁是排它锁:事务1 加X锁,事务1 可读可写,其他事务不能加任何锁

三个封锁协议各自解决的问题:

三个封锁协议各自解决的问题: 一级封锁协议:可防止丢失修改

二级封锁协议:可防止丢失修改和读脏数据

三级封锁协议:防止丢失修改、读脏数据、不可重复读

5.故障的类型:

① 事务内部故障:撤销事务

② 系统故障:硬件错误、断电、系统故障等,称为软故障

③ 介质故障:外存故障等,称为硬故障

④计算机病毒

6.恢复

恢复技术:

常用方法:简历冗余存储,利用该去实时数据库的恢复

建立冗余存储常用的技术是:数据存储、登记日志文件

日志文件记录:事务的开水与结束,以及所有的更新操作

恢复策略:

事务故障恢复:

反向扫描日志文件,查找该事物的更新操作并执行逆操作,继续反向执行查找该事物的其他更新操作

系统故障的恢复:

正向扫描日志文件,找到故障发生前的所有事务进行重入队操作,

将故障发生时尚未完成的事务计入撤销队列

反向扫描撤销队列的事务,进行撤销事务

长相扫描重入队事务,进行重做处理

介质故障:重装数据库,重做已经完成的事务

具有检查点的恢复技术:

增加了一个重新开始文件,并让恢复子系统在登陆日志文件期间动态维护日志,周期性检查坚持点,保存数据库的状态。

img

步骤:

在重新开始文件找到最后一个检查点,得到检查点简历开始时刻所有正在执行的事务清单ACTIVE LIST 放入UNDO LIST

从检查点开始正向扫描日志文件:

新开始的事务,还放在UNDO

又提交的事务,移到REDO

分别对UNDO,REDO执行应该的操作。

7.事务与恢复和并发控制的关系

\1. 撤销事务:将未完成的事物撤销,是数据恢复到事务执行前的正确状态。

(反向查看未完成的事务日志(由后向前扫描),查找事务的更新操作; 对该事务的更新操作执行逆操作。)

\2. 重做事务:将已经提交的事务重新执行。

(从事务的开始标识起,正向扫描日志文件,重新执行日志文件登记的该事务对数据库的所有操作,直至事务结束标识。)

事务故障恢复:利用日志文件撤销此事务已对数据库进行的修改系统故障恢复:撤销故障发生时未完成的事务,重做已完成的事物介质故障:重装数据库,重做已完成的事务

这是我参与「第五届青训营 」笔记创作活动的第13天.