谈一谈对事务的理解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
谈⼀谈对事务的理解
1.事务与四⼤特性
⾯试⽼是谈到事务,事务的实现其实很简单,但是对事务的描述,不同的⼈有不同的看法,描述语⾔更是千变万化,
这种概念性的东西,经验告诉我,不能死记硬背,应该⽤⾃⼰的话来理解才是上上签。
那么,什么是事务?
想要理解什么是事务,应该先从事务的4⼤特性⼊⼿。
分别是:原⼦性、⼀致性、隔离性、持久性。
英⽂缩写是ACID。
什么是原⼦性?
原⼦性就是要么全部执⾏成功,要么全部都不执⾏。
如何理解?就像前⾯有个⽔坑,要么⼀脚向前跨过去,要么就索性不过去。
什么是⼀致性?
事务执⾏的结果,必须是数据库从⼀个⼀致性状态变到另⼀个⼀致性状态。
如何理解?我银⾏账户有200块钱,⼩明银⾏账户为零,现在是⼀致性状态,如果我把200块钱⼀次性
转到⼩明账户后,我的账户为 -200,⼩明的账户为 +200 ,最终我的账户为0,⼩明的账户为200,
总额不变,也就是变到了另⼀个⼀致性,不会出现我的账户-200后⼩明的账户没有+200的情况,否则就不是⼀致性了。
什么是隔离性?
并发操作同⼀个表时,数据库会开启多个事务,事务之间相互隔离,互不影响。
怎么理解?假设有两个事务,分别是事务1和事务2 ,那么两个事务不能相互影响,也就是说,要么事务1在开始之前,事务2已经结束了,
要么事务1在结束之前事务2还没开始,就像加锁操作,只有事务获得锁权限才能对表进⾏操作,否则需要等待。
不然造成脏读、幻读、不可重复读。
【待会解释这3个区别】
什么是持久性?
当事务确认完成后,对数据的改变是永久性的。
怎么理解?对表做曾删改操作,并提交事务后,曾删改操作的结果将存在表中,只要不被其他事务做曾删改操作,那么改变后的表数据将⽤于保持不变。
⼜回到⽼话题,什么是事务?
根据事务的四⼤特性可知,事务就是⼀组严密的逻辑操作,所有操作必须全部执⾏成功,否则将会撤销所有操作,也就是事务回滚操作。
怎么理解?
在⼀个事务中,执⾏⼀组sql操作,如果所有操作都没抛出异常,则commit提交事务,如果抛出了异常,这会执⾏rollback回滚操作,
也就是新增的数据删除,修改的数据则修改回去,删除的则新增回来。
2.事务的并发问题
什么是脏读?
事务1读取了事务2更新后但还没提交的数据,事务2做回滚操作,那么事务1读取的数据就是脏数据,这样的操作就是脏读。
简单来说,脏读就是读取了另⼀个事务的未提交数据。
什么是不可重复读
事务1多次读取同⼀个数据,在事务1读取数据的过程中,事务2对该数据进⾏了更新并提交事务,
导致事务1多次读取同⼀数据的结果不⼀致,这就是不可重复读。
简单来说,不可重复读就是多次读取同⼀数据的结果不⼀致,该数据被另⼀个事务更新并提交了。
什么是幻读?
事务1 两次查询数据,第⼆次查询的结果要么⽐第⼀次的结果少了数据、要么⽐第⼀次的结果多了数据,因为在两次查询之间,被事务2添加或删除了数据,像出现幻觉⼀样。
简单来说,幻读就是多次查询结果不⼀致,后查询的结果⽐之前查询的结果增加或减少了数据。
3.事务隔离级别
【隔离级别从低到⾼】
(1)读未提交
读未提交,顾名思义,就是⼀个事务可以读另⼀个事务未提交的数据,安全性最低的隔离级别,不可避免脏读数据、不可重复读、幻读。
(2)读提交
读提交,顾名思义,就是⼀个事务要等另⼀个事务提交后才能读取数据,为了解决脏读才设⽴的隔离级别,但是不可避免不可重复读、幻读。
(3)可重复度
可重复度,就是在开始读取数据时,不再允许修改操作,为了解决不可重复读⽽设⽴,但是不可避免幻读。
(4)序列化
序列化,最⾼的事务隔离级别,事务串⾏化顺序执⾏,可以避免脏读、不可重复读、幻读,
但是效率低下,消耗数据库性能,⼀般不使⽤。