这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战
事务基础知识
参与业务系统开发,我们需要了解数据库的事务的基础知识。事务的基础概念是:很多复杂的事物要分步进行,但是它们组成了一个整体,要么整体生效,要么整体失效。应用在数据库上,就是多条SQL语句,要么全部执行成功,要么全部执行失败。
数据库事务必须同时满足以下的四个特性,简称ACID:
- 原子性(Atomic):表示组成一个事务的多个数据库是一个不可分割的原子单元,只有所有的操作执行成功,整个事务才提交。假设事务中的任何一个数据库操作失败,已经执行的任何操作都必须撤销,数据库将返回到初始的状态。
- 一致性(Consistency):事务操作成功后,数据库所处的状态和他的业务规则是一致的,即数据不会被破坏,举个例子,假如从A账户转账100元到B账户,不管操作成功与否,A账户和B账户到存款总额是不会变的。
- 隔离性(Isolation):在并发数据操作时,不同的事务拥有各自的数据空间,它们的操作不会对对方产生干扰。并非做到完全无干扰。数据库规定了多种事务隔离级别,不同的隔离级别对应着不同的干扰程度,隔离级别越高,数据的一致性越好,但是随之并发性越弱。
- 持久性(Durability):一旦事务提交成功后,事务中所有的数据操作都必须持久化到数据库中。即使在提交事务后,数据库马上崩溃,在数据库重启时,也必须保证能够通过某种机制来恢复数据的。
数据并发问题
在我们的业务使用场景中,用户并发访问系统是非常常见的,所以多个客户端使用并发的方式访问数据库也是常见的,多个客户端带来的是数据库中的相同数据可能同时被多个事务访问,如果没有采取必要的隔离措施,就会导致并发问题,破坏数据的完整性。现在我们就来使用几个例子介绍产生的几种问题:
-
脏读(dirty read):A事务读取B事务尚未提交的更改数据,并在这个数据的基础上进行操作。如果这时B事务回滚,那么A事务读到的数据根本是不被承认的。比如B事务取款300元,原先有1000元,取出300,剩下700元,那么A事务查询剩下700元,并且增加转账的100元,总共800元。但是B事务这时回滚了。余额变成了800元,丢失了300元。
-
不可重复读(unrepeatable read):不可重复读是指A事务读取了B事务已经提交的更改数据(更改或删除)。A事务在取款事务的过程中,原先查询是1000元,B事务使用该账户转账200元,A账户再次读取账户余额时,变为了800元,两次账户余额不一致。
-
幻象读(phantom read):A事务读取B事务提交的新增数据,这时A事务将出现幻象读的问题,幻想读一般出现在计算统计数据的事务中。假如一个银行系统在同一个事务中进行两次统计存款账户的总金额,这时候刚好新增一个账户,并且存入200元。这时候就会导致两次统计的金额不一致,产生幻象读的问题。
总结
今天我们探究了事务的基础概念以及知识,还有数据库并发所带来的一系列问题。