一个人至少拥有一个梦想,有一个理由去坚强

心若没有栖息的地方,到哪里都是在流浪

数据库事务

事务是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成

概念
一个数据库事务通常包含对数据库进行读或写的一个操作序列。它的存在包含两个目的:

为数据库操作提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。
当一个事务被提交给了DBMS(数据库管理系统),则DBMS需要确保该事务中的所有操作都成功完成且其结果被永久保存在数据库中,如果事务中有的操作没有成功完成,则事务中的所有操作都需要被回滚,回到事务执行前的状态(要么全执行,要么全都不执行);同时,该事务对数据库或者其他事务的执行无影响,所有的事务都好像在独立的运行。

事务的四个特性
事务具有4个属性:原子性、一致性、隔离性、持久性。这四个属性被称为ACID特性。

原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。
隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
持久性(Durability):一个事务一旦提交,他对数据库的修改应该永久保存在数据库中。

举例
用一个常用的“小明使用虚拟货币去超市购买200元的东西”的例子来说明如何通过数据库事务保证数据的准确性和完整性。熟悉关系型数据库事务的都知道从小明帐号支付到到超市帐号需要6个操作:

1、从小明账号中读取余额(1000)。
2、对小明账号做减法操作(1000-200)。
3、把结果写回小明账号中(800)。
4、从商店账号读取余额(2000)。
5、对商店账号做加法操作(2000+200)。
6、把结果写回商店账号中(2200)。

原子性
保证1-6所有过程要么都执行,要么都不执行。一旦在执行某一步骤的过程中发生问题,就需要执行回滚操作。 假如执行到第五步的时候,商店账户突然不可用(比如被银行冻结),那么之前的所有操作都应该回滚到执行事务之前的状态。

一致性
在转账之前,两人账户中共有3000元钱。在转账之后,总账户中共应该还是3000元。也就是说,数据的状态在执行该事务操作之后从一个状态改变到了另外一个状态。同时一致性还能保证账户余额不会变成负数等。

隔离性
在小明向超市支付的整个过程中,只要事务还没有提交(commit),查询小明账户和超市账户的时候,两个账户里面的钱的数量都不会有变化。
如果在小明给超市支付的同时,有另外一个事务执行了小华给超市支付的操作,那么当两个事务都结束的时候,超市账户里面的钱应该是小明、小华总共支付给超市的钱再加上超市自己原有的钱。

持久性
一旦转账成功(事务提交),两个账户的里面的钱就会真的发生变化(会把数据写入数据库做持久化保存)!

原子性与隔离行
一致性与原子性是密切相关的,原子性的破坏可能导致数据库的不一致,数据的一致性问题并不都和原子性有关。
比如刚刚的例子,在第五步的时候,对超市账户做加法时只加了50元。那么该过程可以符合原子性,但是数据的一致性就出现了问题。
因此,事务的原子性与一致性缺一不可。
————————————————
版权声明:本文为CSDN博主「_FlyFish」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/SummerBe/article/details/103001279

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注