数据库的事务四大特性&&隔离级别总结(面试高频)

简介: 数据库的事务四大特性&&隔离级别总结(面试高频)

一、事务及其四大特性

事务(Transaction):访问并可能更新数据库中各种数据项的一个程序执行单元(unit),它通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起。当在数据库中更改数据成功时,在事务中更改的数据便会提交,不再改变。否则,事务就取消或者回滚,更改无效。


举个例子来说,张三给李四转了1000元钱,那么在数据库操作时,就要先把张三的账户减去1000元,再把李四的账户加上1000元,两部分操作放在一起,才是一个完整的转账过程,也可称之为事务。

1)原子性(Atomicity)

原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

就像你买东西要么交钱收货一起都执行,要么要是发不出货,就退钱。


(2) 一致性(Consistency)

一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

打个比方,你买东西这个事情,是不影响其他人的。


(3)隔离性(Isolation)

隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。


(4)持久性(Durability)

持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务已经正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。


打个比方,你买东西的时候需要记录在账本上,即使老板忘记了那也有据可查。


二、事务的隔离性及隔离级别

隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。


即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

为什么要进行隔离

在很多情况下,事务不是一个一个的执行的。为了提升效率,很多时候,多个事务会同时执行(并发执行),那么如果没有一定约束条件,事务相互之间可能就会造成影响。

比如一个售票系统,此时售票表中的剩余票数为1

当两个客户端同时要执行买票操作:先检查剩余的票数是否 > 0 ,如果 > 0,就修改售票表里的计数,让计数 -1 ,如果没有一定的限制措施,是不是就有一定的概率把这个票给抢成了  - 1


上述问题就是两个事务之间产生了干扰和影响,为了避免相互干扰,就引入了”隔离性“,通过隔离性来降低上述的影响


为了解决并发执行事务带来的问题,MySQL等数据库引入了”隔离级别“,可以让用户自行选择一个适合自己当前业务场景的级别

下面我们先来研究一下,并发执行事务的时候都还会有哪些问题?


🍎脏读问题

6d39d56cdec041bda4c5d1fb8d2d473a.png

比如,在做作业的时候,你不会写,但看到你旁边的同学写的头头是道,于是就看了旁边你同学的答案,并且你抄完了然后就去玩了。


可你刚走没一会,你的那个同学发现他刚才写错了,于是就又把刚才的答案给改了(但是你不知道,你抄的答案还是之前那个错的答案)。那么此时我们就把你刚才抄的错误答案称为”脏数据“(意思是数据被污染了,不准确了)同时你抄同学答案的过程就是”脏读“

用专业术语来说就是

94237981dd9e4c559a414497548c22a7.png

那么如何解决脏读呢?

你和你同学说话,你同学在写的过程中,你不要看。只有当你同学完全写完了,马上就要提交给老师了,这个时候你才能看。这就相当于给读操作加了一把锁,降低了并发程度,提高了效率,提高了隔离性~

🍎不可重复读

8a0d9bc892c7465fa6f7bde8d532eecd.png

比如, 有这样两个人,一个负责写代码、另一个负责读代码。写代码的人在9点开始了写代码,等到了10点,写完了,他把代码提交到了码云上。在提交之前,读代码的不能开始读。只有当写代码的提交了以后,才能开始读,于是读代码的等到了10:10,开始读代码了。


但是吧,在读代码的读的过程中,写代码的有开始改代码了,于是负责读代码的同学,读着读着就突然发现数据变了。

a7f0f130d273405d82bf90000c6314eb.png

那怎么解决这个问题呢?


1、负责写代码的同学,在写代码的时候,负责读代码的同学不要读

2、负责读代码的同学,在读代码的时候,负责写代码的同学也不要修改


通过咱们上面的约束,现在的隔离性又提高了,并发性又降低了。数据更准确了,效率更低了~


🍎幻读

但是吧!我们上面规定了同学读的时候我不能改,但闲着也是闲着,我既然不能改你正在读的代码,那么我就改其他的代码~~~你们在读Student.java,我就改Teacher.java


如果Teacher.java本来就存在,也就罢了。但是如果是同学们在读的过程中,我新增了一个Teacher.java或者删除了一个已有的内容,就会产生”幻读“的问题~~~

35042512116e48d1b2d7f09ccd1102c0.png

🍎总结

并发和隔离其实是相悖的,实际使用的时候,就需要根据实际场景,来决定如何选择挡位!!!看场景对于性能比较敏感,还是对于准确性比较敏感~~~


MySQL中给我们提供了四个挡位,供我们自由选择

4个事务隔离级别

Read uncommitted (读未提交):最低级别,以上问题均无法解决。

Read committed (读已提交):读已提交,可避免脏读情况发生。

Repeatable Read(可重复读):确保事务可以多次从一个字段中读取相同的值,在此事务持续期间,禁止其他事务对此字段的更新,可以避免脏读和不可重复读,仍会出现幻读问题。

Serializable (串行化):最严格的事务隔离级别,要求所有事务被串行执行,不能并发执行,可避免脏读、不可重复读、幻读情况的发生

image.png

相关文章
|
2月前
|
SQL 关系型数据库 MySQL
乐观锁在分布式数据库中如何与事务隔离级别结合使用
乐观锁在分布式数据库中如何与事务隔离级别结合使用
|
2月前
|
负载均衡 NoSQL 算法
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
这篇文章是关于Java面试中Redis相关问题的笔记,包括Redis事务实现、集群方案、主从复制原理、CAP和BASE理论以及负载均衡算法和类型。
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
|
2月前
|
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事件查看器以获取更多线索。
|
9天前
|
关系型数据库 MySQL 数据库
深入理解MySQL数据库隔离级别
深入理解MySQL数据库隔离级别
27 1
|
13天前
|
SQL 关系型数据库 MySQL
数据库隔离级别详解,数据库基础操作
数据库隔离级别详解,数据库基础操作
|
2月前
|
人工智能 小程序 关系型数据库
【MySQL】黑悟空都掌握的技能,数据库隔离级别全攻略
本文以热门游戏《黑神话:悟空》为契机,深入浅出地解析了数据库事务的四种隔离级别:读未提交、读已提交、可重复读和串行化。通过具体示例,展示了不同隔离级别下的事务行为差异及可能遇到的问题,如脏读、不可重复读和幻读等。此外,还介绍了在MySQL中设置隔离级别的方法,包括全局和会话级别的调整,并通过实操演示了各隔离级别下的具体效果。本文旨在帮助开发者更好地理解和运用事务隔离级别,以提升数据库应用的一致性和性能。
123 2
【MySQL】黑悟空都掌握的技能,数据库隔离级别全攻略
|
1月前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
65 0
|
2月前
|
存储 安全 NoSQL
|
22天前
|
NoSQL 关系型数据库 MySQL
微服务架构下的数据库选择:MySQL、PostgreSQL 还是 NoSQL?
在微服务架构中,数据库的选择至关重要。不同类型的数据库适用于不同的需求和场景。在本文章中,我们将深入探讨传统的关系型数据库(如 MySQL 和 PostgreSQL)与现代 NoSQL 数据库的优劣势,并分析在微服务架构下的最佳实践。
|
24天前
|
存储 SQL 关系型数据库
使用MySQL Workbench进行数据库备份
【9月更文挑战第13天】以下是使用MySQL Workbench进行数据库备份的步骤:启动软件后,通过“Database”菜单中的“管理连接”选项配置并选择要备份的数据库。随后,选择“数据导出”,确认导出的数据库及格式(推荐SQL格式),设置存储路径,点击“开始导出”。完成后,可在指定路径找到备份文件,建议定期备份并存储于安全位置。
176 11