标签:可重复 开始 多次 现在 不可 aci 假设 导致 特性
面试老是谈到事务,事务的实现其实很简单,但是对事务的描述,不同的人有不同的看法,描述 语言更是千变万化,
这种概念性的东西,经验告诉我,不能死记硬背,应该用自己的话来理解才是上上签。
那么,什么是事务?
想要理解什么是事务,应该先从事务的4大特性入手。
分别是:原子性、一致性、隔离性、持久性。英文缩写是 ACID。
什么是原子性?
原子性就是要么全部执行成功,要么全部都不执行。
如何理解?就像前面有个水坑,要么一脚向前跨过去,要么就索性不过去。
什么是一致性?
事务执行的结果,必须是数据库从一个一致性状态变到另一个一致性状态。 如何理解?我银行账户有200块钱,小明银行账户为零,现在是一致性状态,如果我把200块钱一次性 转到小明账户后,我的账户为 -200,小明的账户为 +200 ,最终我的账户为0,小明的账户为200, 总额不变 ,也就是变到了另一个一致性,不会出现我的账户-200后小明的账户没有+200的情况,否则就不是一致性了。
什么是隔离性?
并发操作同一个表时,数据库会开启多个事务,事务之间相互隔离,互不影响。
怎么理解?假设有两个事务,分别是事务1和事务2 ,那么两个事务不能相互影响 ,也就是说,要么事务1在开始之前,事务2已经结束了,
要么事务1在结束之前事务2还没开始,就像加锁操作,只有事务获得锁权限才能对表进行操作,否则需要等待。
不然造成脏读、幻读、不可重复读。【待会解释这3个区别】
什么是持久性?
当事务确认完成后,对数据的改变是永久性的。
怎么理解?对表做曾删改操作,并提交事务后,曾删改操作的结果将存在表中,只要不被其他事务做曾删改操作,那么改变后的表数据将用于保持不变。
又回到老话题,什么是事务?
根据事务的四大特性可知,事务就是一组严密的逻辑操作,所有操作必须全部执行成功,否则将会撤销所有操作,也就是事务回滚操作。
怎么理解?
在一个事务中,执行一组sql操作,如果所有操作都没抛出异常,则commit提交事务,如果抛出了异常,这会执行rollback回滚操作,
也就是新增的数据删除 ,修改的数据则修改回去,删除的则新增回来。
什么是脏读?
事务1读取了事务2更新后但还没提交的数据,事务2做回滚操作,那么事务1读取的数据就是脏数据,这样的操作就是脏读。
简单来说,脏读就是读取了另一个事务的未提交数据。
什么是不可重复读
事务1多次读取同一个数据,在事务1读取数据的过程中,事务2对该数据进行了更新并提交事务,
导致事务1多次读取同一数据的结果不一致,这就是不可重复读。
简单来说,不可重复读就是多次读取同一数据的结果不一致,该数据被另一个事务更新并提交了。
什么是幻读?
事务1 两次查询数据,第二次查询的结果要么比第一次的结果少了数据、要么比第一次的结果多了数据,因为在两次查询之间,被事务2添加或删除了数据,像出现幻觉一样。
简单来说,幻读就是多次查询结果不一致,后查询的结果比之前查询的结果增加或减少了数据。
【隔离级别从低到高】
(1)读未提交
读未提交,顾名思义,就是一个事务可以读另一个事务未提交的数据,安全性最低的隔离级别,不可避免脏读数据、不可重复读、幻读。
(2)读提交
读提交,顾名思义,就是一个事务要等另一个事务提交后才能读取数据,为了解决脏读才设立的隔离级别,但是不可避免不可重复读、幻读。
(3)可重复度
可重复度,就是在开始读取数据时,不再允许修改操作,为了解决不可重复读而设立,但是不可避免幻读。
(4)序列化
序列化,最高的事务隔离级别,事务串行化顺序执行,可以避免脏读、不可重复读、幻读,
但是效率低下,消耗数据库性能,一般不使用。
标签:可重复 开始 多次 现在 不可 aci 假设 导致 特性
原文地址:https://www.cnblogs.com/c2g5201314/p/13163954.html