关系型数据库事务的ACID特性与实现

关系型数据库事务的ACID特性与实现,第1张

ACID 是为保证事务(transaction)是正确可靠的,所必须具备的四个特性:

以 A 给 B 转账100元为例:

MySQL事务是由 InnoDB 存储引擎实现的。

可以用如下的命令显式的开启事务:

另外,在自动提交(autocommit)模式下,我们执行的每一条 SQL 语句都是一条独立的事务;如果关闭了自动提交(autocommit)模式,则所有的 SQL 语句都在一个事务中,直到执行了 commit 或 rollback,该事务结束,同时开始了另外一个事务。

MySQL 事务的 ACID 特性靠如下机制实现:

Go 语言的 Gorm 提供了对于事务 *** 作的支持:

此外,还有嵌套事务以及手动事务等 *** 作,可以参考中文文档: learnku.com/docs/gorm/v…

@Transactional 注解必须添加在public方法上,private、protected方法上是无效的。

一般情况下,推荐将@Transactional 注解加在方法上,因为@Transactional直接加在类或者接口上,@Transactional注解会对类或者接口里面所有的public方法都有效,会影响性能。

ACID性质

ACID property

定义:ACID指数据库事务正确执行的四个基本要素的缩写,包含原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。一个支持事务的数据库系统,必须要具有这四种特性,否则在事务执行过程中无法保证数据的正确性,处理过程极可能达不到正确要求。

学科:计算机科学技术_数据库_数据库管理系统及其实现

技术

相关名词:数据库 数据库管理系统 事务

【延伸阅读】

从数据库用户的观点看,数据库中某些特定 *** 作的集合需要被认为是一个独立单元。例如,顾客认为从支票账户到储蓄账户的资金转账是一个 *** 作单元,尽管在数据库系统中这是由对支票账户资金余额的修改、对储蓄账户资金余额的修改以及对本次交易的登记等几个 *** 作组成的。显然,必须要求这些 *** 作要么全都发生,要么由于出错而全不发生。保证这一点非常重要。无论从系统的观点还是从用户的观点,都不愿意看到资金从支票账户支出而未转入储蓄账户的情况发生。

由上述问题,可以引入数据库的“事务”概念。事务是构成单一逻辑工作单元的 *** 作集合。不论有无故障,数据库系统必须保证事务的正确执行,即该事务的整个 *** 作集合完全被执行,或属于该事务的 *** 作一个也不执行。此外,数据库系统必须以一种能避免引入不一致性的方式来管理事务的并发执行。例如,假设系统中有一个资金转账事务,将一笔资金从支票账户转到储蓄账户中,假设还有一个事务是计算顾客总金额,它和上述资金转账的事务在系统中并发地执行。如果计算顾客总金额的事务在资金转账事务从支票账户支出金额之前查看支票账户余额,而在资金存入储蓄账户之后查看储蓄账户余额,并对它们进行求和,该事务就会得到不正确的结果,因为同一笔资金被重复计算了两次。所以,为了保证事务的正确执行,维护数据库的完整性,要求数据库系统维护以下事务特性:

原子性:事务的所有 *** 作在数据库中要么全部正确反映出来,要么全部不反映。

一致性:事务的隔离执行(即没有并发执行的其他事务),保持数据库的一致性。

隔离性:尽管多个事务可以并发执行,但系统必须保证,对任一对事务A和B,在A看来,B或者在A开始之前已经停止执行,或者在A完成之后开始执行。这样,每个事务都感觉不到系统中有其他事务在并发地执行。

持久性:一个事务成功完成后,它对数据库的改变必须是永久的,即使系统可能出现故障。

以上特性统称为ACID特性,他们全部是由数据库管理系统来维护的。

成功完成执行的事务称为已提交事务。已提交事务使数据库进入一个新的一致状态。未能成功完成的事务称为中止事务,中止事务必须对数据库的状态不造成影响。即中止事务对数据库所做的任何改变必须撤销。一旦中止事务造成的变更被撤销,就说明事务已回滚。如此,才能保证数据库当中的数据在经过 *** 作或

ACID指数据库事务正确执行的四个基本要素的缩写,包含原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。

一个支持事务的数据库系统,必须要具有这四种特性,否则在事务执行过程中无法保证数据的正确性,处理过程极可能达不到正确要求。

扩展资料

在标准SQL规范中,定义了 4个事务隔离级别,不同的隔离级别对事务的处理不同, 如未授权读取、授权读取、可重复读取和串行化

①未授权读取

未授权读取也被称为读未提交(Read Uncommitted),该隔离级别允许脏读取,其隔离级别最低。换句话说,如果一个事务正在处理某一数据,并对其进行了更新,但同时尚未完成事务,因此还没有进行事务提交,而与此同时,允许另一个事务也能够访问该数据。

②授权读取

授权读取也被称为读已提交(Read Committed),它和未授权读取非常相近,唯一的区别就是授权读取只允许获取已经被提交的数据。同样以上面的例子来说,事务 A和事务同时进行,事务A进行与上述同样的 *** 作,此时,事务B无法看到这个数据项在事务A *** 作过程中的所有中间值,只能看到最终的10。

另外,如果说有一个事务C,和事务A进行非常类似的 *** 作,只是事务C是将数据项从10加到 20,此时事务B也同样可以读取到20,即授权读取允许不可重复读取。

③可重复读取

可重复读取(Repeatable Read),简单地说,就是保证在事务处理过程中,多次读取同一个数据时,其值都和事务开始时刻是一致的。因此该事务级别禁止了不可重复读取和脏读取,但是有可能出现幻影数据。

④串行化

串行化( Serializable)是最严格的事务隔离级别。它要求所有事务都被串行执行,即事务只能一个接一个地进行处理,不能并发执行。

参考资料来源:百度百科-ACID性质


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/10027381.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-04
下一篇2023-05-04

发表评论

登录后才能评论

评论列表(0条)

    保存