数据库事务

数据库事务(transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。

并非任意的对数据库的操作序列都是数据库事务。事务应该具有是4个属性:原子性、一致性、隔离性、持久性。这四个属性通常成为ACID特性。

  原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部执行,要么都不执行。

  一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态,一致状态的含义是数据库中的数据应满足完整性约束。

  隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。

  持久性(Durability):一个事务一旦提交,他对数据库的修改应该是永久保存在数据库中。

如何理解ACID

  举例说明,用一个常用的“A账户向B账户汇钱”的例子来说明如何通过数据库事务保证数据的准确性和完整性。

  熟悉关系型数据库事务的都知道从账户A到账户B需要6个操作:

    1、从A账户中把余额读出来(500)。

    2、对A账户做减法操作(500-100)。

    3、把结果写回A账户中(400)。

    4、从B账户中把余额读书来(500)。

    5、对B账户做加法操作(500-100)。

    6、把结果写回到B账户中(600)。

原子性:

  保证1~6所有过程要么全部执行,要么全部不执行。一旦在执行某一步骤的过程发生问题,就需要执行回滚操作。假如执行到第五步的时候,B账户突然不可用(比如被注销),那么之前的所有操作都应该回滚到执行事务之前的状态。

一致性:

  在转账之前,A和B账户中共有500+500=1000,在转账之后,A和B账户中共有400+600=1000,也就是说,数据的状态在执行数据操作之后从一个状态改变到了另一个状态,同时一致性还能保证账户余额不会变成负数等。

隔离性:

  在A向B转账的整个过程中,只要事务还没有提交(commit),查询A账户和B账户的时候,两个账户里面的钱是不会发生变化。如果在A向B转账的同事,有另外一个事务执行了C给B转账的操作,那么当两个事务都结束的时候,B账户里面的钱应该是A转给B的钱加上C转给B的钱,再加上自己原来的钱。

持久性:

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

  参考:Hollis

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值