数据库:事务(ACID 4大特性,隔离级别,脏读,不可重复读,虚读)

事务:

定义(来自百度词条)

https://baike.baidu.com/item/%E6%95%B0%E6%8D%AE%E5%BA%93%E4%BA%8B%E5%8A%A1/9744607?fr=aladdin

数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。事务是数据库运行中的逻辑工作单位,由DBMS中的事务管理子系统负责事务的处理。

 事务满足4个属性:

1.A原子性:

原子性要求事务必须完整执行。当数据修改时,要么全执行,要么全不执行,不允许事务部分地完成,

2.C一致性:

一个事务执行前后,数据库数据必须保持一致性状态(满足完整性约束),数据库的一致性状态由用户来负责,由并发控制机制实现,例如银行转账,转账前后两个账户金额之和应保持不变。并发操作带来的数据不一致性包括  丢失数据修改,读“脏”数据, 不可重复读和产生“幽灵”数据

脏读:脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。

不可重复读:不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了

不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。

虚读(幻读):幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。

幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)

参考:https://www.cnblogs.com/fjdingsd/p/5273008.html

原子性和一致性的的侧重点不同:原子性关注状态,要么全部成功,要么全部失败,不存在部分成功的状态。一致性关注数据的可见性,中间状态的数据对外部不可见,只有最初状态和最终状态的数据对外可见

参考:https://www.cnblogs.com/bc8web/p/8116447.html

3. I 隔离性:

也称独立性,使得每个事务的更新在它被提交之前,对其它事务都是不可见的。实现隔离性是解决临时更新与消除级联回滚问题的一种方式。例如事务T1和T2,T2要么在T1开始之前已经结束,要么在T1完成之后再开始执行。

数据库有4种类型的事务隔离级别:不提交的读,提交的读,可重复的读与串行化

① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待

② Repeatable read (可重复读):可避免脏读、不可重复读的发生。

③ Read committed (读已提交):可避免脏读的发生。

④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。

级别从高到低排列,级别越高,执行效率越低。在MySQL数据库中,支持上面四种隔离级别,默认的为Repeatable read (可重复读);而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别。

设置数据库的隔离级别要在开启事务之前。

4. D 持久性:

也称永久性,事务完成之后,DBMS保证它对数据库中的数据的修改是永久性的,当系统或者介质发生故障时,该修改也永久性。持久性一般通过数据库备份与恢复来保证。

猜你喜欢

转载自blog.csdn.net/weixin_38108266/article/details/81836391