程序员

  • 一篇文章带你搞懂数据库事务!

    说到数据库,事务是一个不可避免的话题。无论您是研发、实施还是操作和维护,您都需要理解和使用无数据事务的特性。数据库事务连接到各种数据是处理各种数据的基础。那么,数据库事务到底意味着什么呢?数据库事务的特点是什么?让我们跟随本文来了解数据库事务! 什么是事务 举个例子:A(余额1500元)向B(余额500元)银行转账500元,涉及两个操作。 1、 A账户余额减少500元,此时余额应为1000元。 2、 B账户余额增加500元,此时余额应为1000元 如果这两个操作之间出现错误,如银行系统突然崩溃,导致A账户余额减少500,但B账户余额没有增加,这样的系统显然有问题。要么A转账成功(两个操作全部完成),要么A转账失败(两个操作均未实施),使AB用户能够接受此类转账结果。 因此,事务是指由多个步骤组成的操作,要么全部成功,要么全部失败。 了解数据库的事务 从数据库的角度来看,事务是指数据库操作的序列,是一个不可分割的工作单位,要么全部执行,要么全部不执行。 数据库事务有四个特点,称为 ACID 特性: 1、 原子性 事务是最小的执行单位,不允许分割。事务的原子性保证了所有或所有不执行的操作。 2、 一致性 一致性意味着在执行该事务之前和之后,从一个正确的状态转变为另一个正确的状态。以银行转账为例,转账前AB余额为1500 总共2000元,转行后AB余额为1万元 总共2000元,两种状态的总余额应一致,不会多或少。 3、 隔离性 隔离意味着当多个事务并发执行时,它们不会相互影响,并发事务之间的数据库是独立的。 在A转移到B的过程中,只要事务尚未提交,AB两个账户的余额就不会改变。如果A转移到B(执行一项事务),C转移到B(执行另一项事务),当两项事务结束时,B账户的余额应为“原余额” B转账金额 “C转账金额”。 4、 持久性 事务提交后,数据库中的数据变化是永久的,即使数据库发生故障,修改的数据也不会丢失。 事务隔离等级 如果两个并发执行的事务涉及到同一数据的操作,可能会出现以下问题: 1、 脏读(Ditry Read / Read Uncommitted) 脏读是指一个用户读取另一个用户未提交的数据。例如: 用户A和用户B提交事务后,发现最终库存为1。但由于A的提交已经回滚,所以正确的库存应该是5。 如何解决脏读?读取已提交。控制一个事务只能读取其他事务提交后的数据。 2、 不可重复读(UnRepeatable Read) 不能重复阅读,是指在同一事务中,两次阅读相同的数据,返回结果不同。 不能重复阅读的原因是事务并发修改记录。为了避免这种情况,最简单的方法是锁定要修改的记录,这可能会加剧锁的竞争,影响性能。 3、 幻读(Phantom Read) 上述不可重复读取发生在两次读取之间,数据更新。如果在两次操作之间插入新数据怎么办? 在上述例子中,用户B的更新结果与预期不一致,仿佛产生了幻觉。 不可重复读取和幻读是两个容易混淆的概念。不可重复读取发生在一行数据中,可通过锁定行解决。幻读发生在多行记录中,可通过锁定表解决。 数据库系统提供了隔离级别的概念,以解决上述并发问题。 Read uncommitted (读未提交):在最低水平上,上述问题无法解决。 Read committed (阅读已提交):阅读已提交,可避免脏读问题。 Repeatable Read(可重复读):确保事务可以从一个字段中多次读取相同的值。在此事务持续期间,禁止其他事务更新此字段,以避免脏读和不重复读,并且仍然存在幻读问题。 Serializable (序列化):最严格的事务隔离级别要求所有事务串行执行,不能并发执行,可以避免脏读、重复读、幻读。 数据库锁 在数据库中同时修改多个SQL语句会导致并发控制问题。如果不控制,事务中的隔离会被破坏,造成不可预测的错误。实现并发访问可以使用两种类型的锁,即读锁/共享锁和写锁/排他锁: 读锁/共享锁:共享锁,多个客户端可以同时读取一个资源,互补干扰。如果事务A在数据上加上共享锁,事务B可以读取数据,而不是修改数据。 写锁/排他锁:一个锁会阻止其他写锁和读锁,以确保只有一个事务在一个时间内修改和写入数据。如果事务A在数据中添加排他锁,则事务B不能读取或修改数据。 以上是数据事务库的内容和特点。如果您想进一步了解和学习,请搜索并访问“葡萄城官方网站”,观看葡萄城免费开发技术开放课程:一节课将带您了解数据库事务!

    程序员 January 30, 2023