事务(一)、事务概念入门

事务(Transaction) 是由一系列对系统中数据进行访问与更新的操作所组成的一个程序执行线逻辑单元;是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。

  • Atomicity原子性:一个事务的所有系列操作步骤被看成是一个操作,也就是一个原子操作。
  • Consistency一致性:如果两个以上数据表有关联,那么更新一个表同时另外一个表也要一起更新。
  • Isolation隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。
  • Durability持久性:在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

银行转账用例

李雷向韩梅梅转账100元

故事的原初

李雷和韩梅梅分别在数据库中有一条记录,假定李雷账户是pk=1 ,有200元; 韩梅梅的账户是pk=2,有100元。

一切的数据资源表现为持久的数据存储。通俗来讲所有人的钱只是银行IT系统中数据库的一条记录;如果所有银行的数据丢失并且无法恢复,所有人都的一无所有;真正实现了平等 ?
所以这里涉及了事务的一个特性“持久性”,数据的状态在没有业务触发的情况下必须持久保存,不能丢失。

执行用例

一个程序员开心写了一个代码,运行在火星人民银行的系统中:

开始
   查看李雷是否有一百元
   李雷账号pk=1减少100元
   韩梅梅账号pk-=2增加100元
结束

期望结果

在数据库中李雷账户有100元,韩梅梅账号有200元。

异常场景1

在执行完第二行代码“李雷账号pk=1减少100元”后,火星人民银行机房停电,第二行没有继续执行。系统重启后查询数据发现在数据库中李雷账户有100元,韩梅梅账号有100元。系统中有100元不翼而飞 ?

这里破坏了事务的 “原子性”

异常场景2

发起转账后,李雷迫不及待的查看自己账户。当看到自己的账户减少了一百块以后,李雷问电话那头的梅梅:“梅梅,我看我这里操作成功了,你那里收到钱了没?” 。 如果这时候梅梅跟李雷说:"雷~ 我没看见我账户的钱有变化啊“。

这里事务的 “一致性” 没有保证。其他用户看到了事务三步操作过程中的中间状态信息,这种信息是明显反用户常识的,所以应该尽可能被避免。

异常场景3

在李雷给韩梅梅转账时,李雷的立即向魏华转账200(别问我为什么,我都不知道魏华是谁)。火星人民银行的系统再次执行程序员“开心”的代码,当执行查看李雷是否有两百元时,给韩梅梅转账的程序还没有执行完第二行“李雷账号pk=1减少100元”,所以这时结论是李雷有两百元,程序继续执行“李雷账号pk=1减少200元”。

这里事务的 “隔离性” 没有保证。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。

总结

程序员开心非常的不开心,他觉得自己的代码没有问题,在他那里跑得很正常,无法接收生产上诡异的问题,肯定是大家调用的姿势不对。他去想另一个程序员穷开心倾诉,穷开心一下把问题提升到信仰的高度。

事务ACID特性可能遭到破坏的因素有:

  • 多个事务并行运行时,不同的事务操作交叉执行;
  • 事务在运行过程中被强行停止。

在第一种情况下,系统必须保证多个事务的交叉运行不影响这些事务的原子性;在第二种情况下,必须保证被强行终止的事务对系统和其他事务没有任何影响。

听罢,开心茅塞顿开。
然并卵,臣妾做不到啊。。。

参考 http://blog.sina.com.cn/s/blog_693f08470101l8bf.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值