数据库事务介绍

数据库事务介绍

背景介绍

实际上本身是想写一篇分布式事务相关的文章作为内部公司部门分享所用,但是发现如果直接从分布式事务开始介绍无法让同学门能由浅
入深的去理解分布式事务的概念,遂先介绍数据库的本地事务。注:因为本人只对Mysql有所了解,因此文章中提到的相关技术实现都是以Mysql为主。

什么是事务

通常只要是一个数据读写的系统都会涉及到事务的处理,也就是所说的对数据的ACID。

  • A(Atomicity)原子性:对数据的一系列操作(增、删、改),要么全部成功,要么全部失败,不存在中间状态。

  • C(Consistency)一致性:数据在任何时刻的状态都是一致的。

  • I(Isolation)隔离性:不同的线程对数据(增、删、改、查)的操作相互不影响。

  • D(Durability)持久性:对于已经提交成功的事务数据必须落盘。

事务实现

持久性

持久性说简单一些就是将数据落盘,如果数据在内存中不落盘,那么一旦发生崩溃或者断电重启数据也就消失了,持久性无从谈起。
那么现在问题也就在于什么时候将数据落盘了。如果在事务提交前持久化数据【1】,在这个时候异常崩溃,等待恢复之后事务虽然还
未提交但是已经有数据被持久化了,数据库必须要能回滚这部分数据。如果在事务提交之后持久化数据【2】,在这个时候异常崩溃,等待恢复
之后数据库必须将这部分未持久化的数据持久化,否则就无法满足持久性。同时我们知道数据的落盘是个耗时操作,数据状态并不是瞬时操作,数据可能存在正在写入
的状态,如果这个时候系统崩溃了数据也就不完整了,这也引出了下面的原子性。

										  begin
											|
										  sync【1】
										  	|
									     commit
									        |
									      sync【2】

原子性

因此当前主流数据库都引入了日志的概念,提交之前先写入日志,等到事务提交之后写入一个commit record标记,再将日志中的数据持久化到磁盘中。当事务在提交之前崩溃,恢复之后查看日志没有commitRecord,那么日志记录就直接废弃。如果事务在提交之后崩溃,恢复之后发现有标记那么继续崩溃之前的持久化。这个也就是WAL机制(Write-Ahead-Log日志预写)。

										  begin
											|
										write log
										  	|
									     commit
									        |
									      sync

现在已经解决了原子性和持久性问题,但是还遗留一个缺陷。sync是一个比较耗时的操作(随机写)如果事务过程中影响的数据较多,即使这个时候磁盘IO非常空闲,也无法执行sync操作,那么就会消耗许多资源。因此innodb对WAL进行了优化,使用了redolog和undolog,使事务在未提交的时候就开始sync操作(交给操作系统判断,具体什么时候刷盘),不必等到事务提交才开始写入磁盘。每次修改数据时分别写入一条redo和undo日志,即使在事务未提交的时候崩溃,也能通过commitRecord和undoLog来回滚未提交且已经持久化的数据。如果事务已经提交但是又还为全部刷盘,恢复的时候可以通过commitRecord和redoLog继续刷盘。

隔离性

隔离性需要不同事务之间做到相互不影响,mysql有四种隔离级别,串行、可重复读、读已提交和读未提交。mysql通过不同的锁来实现这4种隔离模式,大致可分为两种类型,分别是读锁和写锁(范围锁本质上也是读锁和写锁)还有一些读写的优化叫读写意向锁。

  • 串行:事务执行期间所有的读写操作均加上读写锁以及范围锁,直到事务结束之后释放。所有事务之间读写如果存在冲突只允许串行执行。
  • 可重复读:事务过程中加读写锁,但是不加范围锁。只有加锁的数据不同事务之间存在互斥,由于没有范围锁,因此其他事务允许插入或者删除未锁的数据,从而导致当前事务出现幻读(事务内不同查询数据不一致),但是innodb采用MVCC对此进行了优化,存在当前读和快照读的概念,优化了只读事务的幻读问题,但是读写事务仍然存在幻读。
  • 读已提交:事务过程中加读写锁,不加范围锁,但是读锁在操作完成之后立马释放,写锁直到事务提交或者回滚释放。因此在一个事务过程中能读取到其他事务已经提交的数据(因为其他事务已经释放了写锁,当前事务可以添加读锁),导致在一个事务中对同一条数据的读取值可能不同。
  • 读未提交:事务过程中只加写锁,其余均不加锁。由于只有写锁没有读锁,因此其他事务就能够直接读取到只有写锁的其他事务数据(因为读取数据不需要读锁了)。

一致性

实际上一致性的实现就是通过持久性、原子性、隔离性来实现的,一致性是事务需要达到的最终目的和结果。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值