数据库总结:事务

概念

多个读写操作捆绑在一起形成一个逻辑操作单元,即所有读写是一个执行整体,要么提交,要么失败(可以安全重试)。
事务不是一个天然存在的东西,是被人创造出来的,目的是简化应用层的编程模型。

你真的动ACID吗?

原子性(Atomicity):假如没有原子性,多个操作中间发生错误(进程崩溃、磁盘问题、网络中断等),需知道哪些更改已生效,哪些没生效,寻找过程非常复杂,而原子性简化了此问题,应用程序可认为没有实质发生更改,可安全重试。(叫可中止性更准确)
一致性(Consistency):指数据库处于应用程序所期待的“预期状态”;是应用程序需保证的事情而非数据库(只有原子、隔离、持久是数据库自身属性)。
CAP理论中指“可线性化”;
副本一致性(异步复制)时,会引发“复制滞后问题”
隔离性(Isolation):并发执行的多个事务相互隔离,不能相互交叉。
实践中,性能考虑不会实行串行化隔离。Oracle实行快照隔离,还有“弱隔离级别”等
隔离是假装没有发生并发,串行化隔离是最终执行与串行(一次一个)执行结果相同。
持久性(Durability):一旦提交成功,数据不消失。包括写入磁盘、复制到远程机器以及备份。
现实情况是没有哪项技术可以提供绝对持久性。

什么是弱隔离级别?

就是非串行化隔离。
那么为什么应用程序中可以提供可串行化的隔离级别,而数据库却不能呢?其实根本原因就是应用程序对临界区大多是内存操作,而数据库要保证持久性(Durability),需要把临界区的数据持久化到磁盘,可是磁盘操作比内存操作要慢好几个数量级,一次随机访问内存、 固态硬盘 和 机械硬盘,对应的操作时间分别为几十纳秒、几十微秒和几十毫秒,这会导致持有锁的时间变长,对临界区资源的竞争将会变得异常激烈,数据库的性能则会大大降低。
所以,数据库的研究者就对事务定义了隔离级别这个概念,也就是在高性能与正确性之间做一个权衡,相当于明确地告诉使用者,我们提供了正确性差一点但是性能好一点的模式,以及正确性好一点但是性能差一点的模式,使用者可以根据自己的业务场景来选择一个合适的隔离级别。

快照隔离

mvcc

几个概念

脏写:一个事务覆盖了其他事务尚未提交的写入。
脏读:一个事务读到了其他事务尚未提交的写入。
不可重复读:一个事务内,多次读取同一个记录的结果不一样。
更新丢失:两个事务同时执行“读-修改-写回”操作序列,事务 A 覆盖了 事务 B 的写入,但又没有包含 事务 B 修改后的值,最终导致了部分更新数据发生了丢失。
幻读:一个事务内,多次读取满足指定条件的数据,读出来的结果不一样。
写倾斜:事务首先查询数据,根据返回的结果而作出某些决定,然后修改数据库。当事务提交时,支持决定的前提条件已不再成立。

贴张图吧在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值