谈谈对于数据库事物的理解

总所周知的,数据库有4个基本的特性,别人问道我,之前我也是可以做到脱口而出,不就是ACID吗?这又什么难度,
(1)A:原子性(Atomicity)
(2)C:一致性(Consistency)
(3)I:隔离性(Isolation)
(4)D:持久性(dependency)
我也很清楚的明白每个特性代表的意义,原子性不就是说数据库的每一个操作都是原子的吗?如果发生就发生,不发生就不发生,俗称说一做一,一致性,不就是更改的数据前后要一致吗?隔离性每个事物之前相互独立?持久性,我们做出的数据操作是永久保存到数据磁盘中去的。
虽然对于这些特性的解释很熟练,但是对于真正理解数据库的含义,我确实非常不解的,总是模糊不清,也是是当初还没有现在的这个境界吧,很多的概念随着时间的流逝我也变得清晰起来了,为了得到更好的并发效果,我们很多时候都是从隔离性这里入手的,根据不同的隔离性采用不同的策略,但不同的隔离级别会带来不同的问题脏读,幻读,不可重复读,先来看看4个隔离级别:
(1)read-uncommit:读-不提交事物
(2)read-commit:读-提交事务
(3)read-repeated:可重复读
(4) Serializable:序列化
我们通过一个例子来说明一下,最常见的银行卡里面钱的问题:
(1)比如你的账户里面现在有1000块,你现在准备去买点东西,买东西的时候你查了一下余额,发现还有800,然后就准备刷卡购物100,但其实在你查询的这个时间,你的老婆正在消费,花了200,但是事物没有提交,过了一会,你结账了,但是你的老婆没有买单,她取消了,然后你重新查了一下帐,我的乖乖,怎么你的卡无端端的多了200?发现竟然有900块!!!!!!!!是不是很神奇,这就是所谓的脏读,没有read-uncommit可以读取到没有提交 事物的数据,为了解决这个问题,
(2)read-commit,即是每一次读取事物都是从提交的事物读取的数据,还是这个例子,你去买东西之前查了一下你的银行卡余额还有2000,于是准备去买一台1999的手机,但是扣款的时候发现余额不足!!!因为在这个过程你老婆使用了一次卡,用了500,并且把事物提交了,所以余额不足,虽然解决了脏读的问题,但是会带来不可重复读的问题,于是聪敏的人就又改成了repeated可重复读,
(3)repeated:可重复读其实也很简单理解,就是我在读取数据的时候不允许改变数据操作。但是会出现幻读的操作,比如你在查询余额的时候显示是1000,但是打印出来的时候是800,因为这段时间你读取数据完了之后,你的老婆消费了200,所以会出现幻读.
(4)可序列化就不多作介绍了,跟同步一样,操作要一个一个的做,并发性能比较差,最好的方法就是跟编程的锁联系在一起理解数据库的隔离级别,实现这些隔离级别分别是时候了什么锁的类型来实现的。
详细的数据库事物可能还有很多,但我觉得理解这样对于普通的开发足够了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值