当前位置:   article > 正文

ACDI事务四大特性以及事务的隔离级别

acdi

目录:

一:ACDI事务四大特性

二:事务的隔离级别

Read uncommitted(读未提交)

Read committed(读并提交)

Repeatable read(重复读)

Serializable(序列化)


一:ACDI事务四大特性

1.原子性(Atomicity):指事务内所有操作要么一起执行成功,要么都一起失败(或者说是回滚);如事务经典转账案例:A给B转账,A把钱扣了,但B没有收到;可见这种错误是不能接受的,最终会回滚,这也是原子性的重要性。

2.一致性(Consistency):指事务执行前后的状态一致,如事务经典转账案例:

A给B互相转账,不管怎么转,最终两者钱的总和还是不变。

3.持久性(Durability):事务一旦提交,数据就已经永久保存了,不能再回滚。

4.隔离性(Isolation):指多个并发事务之间的操作互不干扰,但是事务的并发可能会导致数据脏读、不可重复读、幻读问题,根据业务情况,采用事务隔离级别进行对应数据读问题处理。

二:事务的隔离级别

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

SQL 标准定义了四种隔离级别,MySQL 全都支持。这四种隔离级别分别是:

  1. 读未提交(READ UNCOMMITTED)

  2. 读已提交 (READ COMMITTED)

  3. 可重复读 (REPEATABLE READ)

  4. 串行化 (SERIALIZABLE)

查看默认隔离级别

show variables like '%transaction%';
select @@transaction_isolation;

 修改隔离级别

  1. SET [GLOBAL | SESSION] TRANSACTION
  2. transaction_characteristic [, transaction_characteristic] ...

Read uncommitted(读未提交)

读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据。

举例:我的老板看我最近工作很辛苦准备给我发1000元奖金,但是财务不小心多按了个零,还没有来得及提交事务, 就在这个时候,我发现的工资卡多了9000元,我以为涨工资了高兴的飞起 , 财务发现不对,回滚了事务,将奖金有改回了1000元再提交。

分析:事务A读取到了事务B未提交的数据,而事务B有可能不提交该事务,

如果事务B不提交事务而是回滚则数据不会保存到磁盘上,也就意味着事务A读取到的数据有可能不存在,

所有事务A读取到事务B的是数据是脏数据,这种现象我们成称之为脏读.

结论:如果事务隔离级别运行在 Read uncommitted 级别 有 脏读 的可能性。

Read committed(读并提交)

读已提交,顾名思义,就是一个事务要等另一个事务提交后才能读取数据。

举例:某已婚女子欲购买一套新房准备迎接新生命的到来,购房款 330万 ,付款的时候查询自己账号余额 360万(第一次查询),就在这个时候,该已婚女子的爱人,购买了辆车,价值50万,并提交务;该已婚女子使用POS机付房款的时候发现钱不够了(第二次查询需要等待爱人支出事务提交完成)。

分析:该女子要想把房款支付就必须要等其爱人的支出事务提交后,该女子才能支付房款。

注意如果有事务对数据进行更新(UPDATE)操作时,读取数据事务要等待这个更新操作事务提交后才能读取数据,

有效的避免脏读,但是一个事务进行了两次相同的查询而返回了不同的数据,这就是不可重复读。

Repeatable read(重复读)

重复读,就是在开始读取数据(事务开启)时,不再允许修改操作

举例:某已婚女欲购买一套新房准备迎接新生命的到来,购房款 330万 ,付款的时候查询自己账号余额 360万(第一次查询),就在这个时候,该已婚女的爱人无法从该已女男账户转出余额,接下来就可以正常付款了。

分析:重复读可以解决不可重复读问题。不可重复读对应的是修改,即UPDATE操作。但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作。

幻读举例:

某已婚男 该月 使用拨出了 25 个电话,该已婚男爱人 查岗,

SELECT 所有 电话记录合计25条,

就在个时候 该已婚男又打了一电话,向数据库 INSERT 了一条记录并提交

可是当该已婚男的爱人打印 该已婚男 电话记录的时候 居然又26条记录

似乎出现幻觉。

Serializable(序列化)

Serializable 是最高的事务隔离级别,事务串行化顺序执行,

可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

注意: 大多数数据库默认的事务隔离级别是Read committed,比如Sql Server , Oracle。Mysql的默认隔离级别是Repeatable read。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/215309
推荐阅读
相关标签
  

闽ICP备14008679号