什么是事务,了解事务的隔离级别和传播行为

news/2024/11/20 2:27:08/

一、什么是事务?


        事务(Transaction)是访问并可能更新数据库中各项数据项的一个程序执行单元(unit)。 事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。

        事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。

        事务结束有两种,事务中的步骤全部成功执行时,提交事务。如果其中一个失败,那么将会发生回滚操作,并且撤销之前的所有操作。也就是说,事务内的语句,要么全部执行成功,要么全部执行失败。

        事务是恢复和并发控制的基本单位。

        事务具有四个特征:原子性、一致性、隔离性和持久性。这四个特征通常称为ACID。

事务的特性(ACID)


原子性(Atomicity):原子性是指一个事务中的操作,要么全部成功,要么全部失败,如果失败,就回滚到事务开始前的状态。

一致性(Consistency):一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。那转账举栗子,A账户和B账户之间相互转账,无论如何操作,A、B账户的总金额都必须是不变的。

隔离性(Isolation):隔离性是当多个用户 并发的 访问数据库时,如果操作同一张表,数据库则为每一个用户都开启一个事务,且事务之间互不干扰,也就是说事务之间的并发是隔离的。
持久性(Durability):持久性就是指如果事务一旦被提交,数据库中数据的改变就是永久性的,即使断电或者宕机的情况下,也不会丢失提交的事务操作。

二、事务隔离级别


数据库事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事务的并发操作中可能会出现脏读,不可重复读,幻读。

Sql Server , Oracle默认隔离级别是读已提交的。Mysql的默认隔离级别是可重复读

脏读:指当一个事务正在访问数据,并且对数据进行了修改,而这种数据还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据还没有提交那么另外一个事务读取到的这个数据我们称之为脏数据。依据脏数据所做的操作肯能是不正确的。
不可重复读:指在一个事务内,多次读同一数据。在这个事务还没有执行结束,另外一个事务也访问该同一数据,那么在第一个事务中的两次读取数据之间,由于第二个事务的修改第一个事务两次读到的数据可能是不一样的,这样就发生了在一个事物内两次连续读到的数据是不一样的,这种情况被称为是不可重复读。
幻象读:一个事务先后读取一个范围的记录,但两次读取的纪录数不同,我们称之为幻象读(两次执行同一条 select 语句会出现不同的结果,第二次读会增加一数据行,并没有说这两次执行是在同一个事务中)

1、读未提交 (Read uncommitted)

就是一个事务可以读取另一个未提交事务的数据。

事例:老板要给程序员发工资,程序员的工资是3.6万/月。但是发工资时老板不小心按错了数字,按成3.9万/月,该钱已经打到程序员的户口,但是事务还没有提交,就在这时,程序员去查看自己这个月的工资,发现比往常多了3千元,以为涨工资了非常高兴。但是老板及时发现了不对,马上回滚差点就提交了的事务,将数字改成3.6万再提交。

分析:实际程序员这个月的工资还是3.6万,但是程序员看到的是3.9万。他看到的是老板还没提交事务时的数据。这就是脏读。

Read committed!读提交,能解决脏读问题。

2、读已提交 (Read committed)

就是一个事务要等另一个事务提交后才能读取数据。

事例:程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他埋单时(程序员事务开启),收费系统事先检测到他的卡里有3.6万,就在这个时候!!程序员的妻子要把钱全部转出充当家用,并提交。当收费系统准备扣款时,再检测卡里的金额,发现已经没钱了(第二次检测金额当然要等待妻子转出金额事务提交完)。程序员就会很郁闷,明明卡里是有钱的…

分析:这就是读提交,若有事务对数据进行更新(UPDATE)操作时,读操作事务要等待这个更新操作事务提交后才能读取数据,可以解决脏读问题。但在这个事例中,出现了一个事务范围内两个相同的查询却返回了不同数据,这就是不可重复读。

那为什么“读提交”同“读未提交”一样,都没有查询加锁,但是却能够避免脏读呢?

这就要说道另一个机制“快照(snapshot)”,而这种既能保证一致性又不加锁的读也被称为“快照读(Snapshot Read)”

假设没有“快照读”,那么当一个更新的事务没有提交时,另一个对更新数据进行查询的事务会因为无法查询而被阻塞(因为上了X锁,即写锁,所以不能得到S锁,即读锁),这种情况下,并发能力就相当的差。而“快照读”就可以完成高并发的查询,不过,“读提交”只能避免“脏读”,并不能避免“不可重复读”和“幻读”。
  
可重复读能解决不可重复读问题

3、可重复读 (Repeated Read)
重复读,就是在开始读取数据(事务开启)时,不再允许修改操作。而它也是MySql的默认隔离级别。

事例:程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他埋单时(事务开启,不允许其他事务的UPDATE修改操作),收费系统事先检测到他的卡里有3.6万。这个时候他的妻子不能转出金额了。接下来收费系统就可以扣款了。

分析:重复读可以解决不可重复读问题。写到这里,应该明白的一点就是,不可重复读对应的是修改,即UPDATE操作。但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作。

什么时候会出现幻读?

事例:程序员某一天去消费,花了2千元,然后他的妻子去查看他今天的消费记录(全表扫描FTS,妻子事务开启),看到确实是花了2千元,就在这个时候,程序员花了1万买了一部电脑,即新增INSERT了一条消费记录,并提交。当妻子打印程序员的消费记录清单时(妻子事务提交),发现花了1.2万元,似乎出现了幻觉,这就是幻读。

串行化可解决幻读问题

4、串行化(Serializable ):

Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

三、数据库的传播行为


传播行为分为两种:分为支持事务的传播和不支持事物的传播

1、PROPAGATION_REQUIRED:(支持事物)如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。

2、PROPAGATION_SUPPORTS:(支持事物)支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。‘

3、PROPAGATION_MANDATORY:(支持事物)支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。

4、PROPAGATION_REQUIRES_NEW:(支持事物)创建新事务,无论当前存不存在事务,都创建新事务。

5、PROPAGATION_NOT_SUPPORTED:(不支持事物)以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

6、PROPAGATION_NEVER:(不支持事物)以非事务方式执行,如果当前存在事务,则抛出异常。

7、PROPAGATION_NESTED:(不支持事物)如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。
 


http://www.ppmy.cn/news/40934.html

相关文章

行为型模式-责任链模式

行为型模式-责任链模式 责任链模式(Chain of Responsibility)解决请求处理问题描述适用环境优点:缺点:违反原则:代码实现责任链模式(Chain of Responsibility) 解决请求处理问题 描述 通过将多个对象组成一条处理链来依次处理请求,从而使得请求能够被动态地转发和处…

头歌(Linux之进程管理一):第2关:进程创建操作-fork

任务描述 在上一关我们学习如何获取进程的pid信息,本关我们将介绍如何编程创建一个新的进程。 本关任务:学会使用C语言在Linux系统中使用fork系统调用创建一个新的进程。 相关知识 在Linux系统中创建进程有很多函数可以使用,其中包括了系…

银行数字化转型导师坚鹏:城商行数字化转型案例研究

城商行数字化转型案例研究课程背景: 很多银行存在以下问题:不清楚城商行数字化转型能否成功?不知道其它城商行数字化转型的成功做法?不知道其它标杆城商行的数字化转型战略? 课程特色:用实战案例解…

个人练习-Leetcode-1588. Sum of All Odd Length Subarrays

题目链接:https://leetcode.cn/problems/sum-of-all-odd-length-subarrays/ 题目大意:给出一个数组,求其中所有长度为奇数的子列的所有元素和。 思路:虽然写着是简单题(暴力做可以通过),但一看…

看懂体操 - 1. 通识

目录基本规则基本动作基本规则 ㊀ 女子体操共分为 6 个项目: ① 团体 (TQ 团体预赛 、TF 团体决赛) 团体总分前 8 名进入 TF ② 个人全能 (AA 个人全能决赛) 4 项总分前 24 名进入 AA ③ 4 个单项 (EF 单项决赛): ❶ 自由操 (FX)…

国产化ChatGPT来袭,景联文科技提供专业数据采集标注服务,人手一个专属ChatGPT或成为可能

ChatGPT作为一个颠覆性的创新,现已成为火爆全球的智能应用。 自ChatGPT爆火以来,国内科技圈开始频频发力,多家科技和互联网公司纷纷表示将开发出中国本土化的ChatGPT。 以百度为例,3月16日,百度推出新一代知识增强大语…

ERTEC200P-2 PROFINET设备完全开发手册(2-2)

2.2调试协议栈 评估板的对外接口如下: JTAG:调试200P-2的20pin JTAG接口 200P-2 UART2: 默认的调试串口,TTL电平(注意:千万不要连RS-232) X7:MINI USB,为开发板提供5V…

1668_MIT 6.828 xv6代码中虚拟存储的配置实现分析

全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 看了xv6书籍的第二章节之后,决定看看xv6的代码实现。之前已经花了一些时间做lab2,估计这一次看代码应该会顺利一些。找一下对等的功能在xv6…