数据库事务四大特性、四大隔离级别以及解决的三种问题

2022-09-05 09:56:52

一、数据库事务的四大特性:(ACID)

  • 原子性( Atomicity ):指的是事务是一个不可分割的工作单位,要不全部成功,要不全部回滚
  • 一致性( Consistensy ):事务在执行前后数据库处于一致性。(如:AB之间转账,A少100,B必须要增加100)
  • 隔离性( Isolation ):多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要相互隔离
  • 持久性( Durability ):指一个事务一旦被提交,他对数据库的影响是永久性的。

二、数据库事务隔离级别数据(脏读,不可重复读,幻读)

前提:事务并发情况下

由低到高依次为Read uncommitted 、Read committed 、Repeatable read 、Serializable ,这四个级别可以逐个解决脏读 、不可重复读 、幻读 这几类问题

1、读未提交(Read Uncommitted)

当隔离级别设置 read uncommittend时,容易出现数据的脏读。

如:A向B还钱,但是该事务没有提交,此时B正好去查看发现多了100,觉得A可以啊,可是此时A 发现了多打了100,迅速回滚事务,修改金额,提交事务,最后B 心理有了落差感

脏读:读取到了未提交的数据

2、读已提交(Read Committed )

当隔离级别设置为 read committed 时,避免了脏读,但是可能会造成不可重复读。

如:A与B 同时操作A的卡,A在进行插卡付款这个过程中,插卡时显示有500元,此时B在他付款前,把A中的 500 元全花了,导致A 付款失败,刷了一夜盘子

不可重复读:是指在一个事务内,多次读同一条数据。在这个事务还没有结束时,另一个事务对该数据进行了修改了,导致两次读取的数据不同

注意:大多数数据库的默认级别就是Read committed,比如Sql Server , Oracle。

3、可重复读 ( Repeatable Read )

当隔离级别设置为 repeatable read 时,避免了不可重复读,但是可能会造成幻读。

如:当B 在查看A 的消费记录时,转了一下头,A此时买了一个裤衩,又新增了一条记录,回头时B发现怎么又多了一条记录,以为出现了幻觉

幻读:指的在一个事务内,前后查询同一范围内的数据,发现前后两次查询的数据不一样。

注意:Mysql的默认隔离级别是Repeatable read。

4、可串行化 ( Serialzable )

serializable是最高的事务隔离级别,在此级别下,事务顺序执行,不仅可以避免脏读,不可重复读,还避免了幻读,但是,性能很低,代价高昂,一般很少使用

注意:脏读与不可重复读针对的都是同一条数据,幻读针对的是一部分数据

  • 作者:guohg1234
  • 原文链接:https://blog.csdn.net/guohg1234/article/details/118545365
    更新时间:2022-09-05 09:56:52