欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

简单易懂:聊聊数据库事务的基本概念

最编程 2024-02-24 15:05:26
...

什么是事务

定义:由一组操作构成,我们希望这组操作能够全部正确执行,如果这一组操作中的任意一个步骤发生错误,那么就需要回滚之前已经完成的操作。也就是同一个事务中的所有操作,要么全部执行执行,要么全部都不执行。

百度百科:事务(Transaction)一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。 事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。

数据库事务VS文件系统事务区别

数据库中的事务是数据库区别于文件系统的重要特性。

1)在文件系统中如果正在执行写文件操作,这时操作系统突然崩溃了,那这时这个文件极有可能被遭到了破坏。无法在失败的时候进行回滚。

比如更新两个文件,第一个更新完后,再更新第二个,但过程中,第二个更新过程失败了,此时文件系统没办法让两份文件回到执行前的状态。

2)在数据库系统中,一个事务是指:由一系列数据库操作组成的一个完整的逻辑过程。

例如银行转帐,从原账户扣除金额,以及向目标账户添加金额,这两个数据库操作的总和,构成一个完整的逻辑过程,不可拆分。 上述两个操作,在一个事务中要么都成功,要么都失败,不会出现中间态情况。这个过程被称为一个事务,具有ACID特性。ACID的概念在ISO/IEC 10026-1:1992文件的第四段内有所说明。[1]

数据库为什么要引入事务

数据库引入事务主要目的:

事务会把数据库从一种一致状态转换为另一种一致状态。

在数据库提交工作时,可以确保要么所有修改都已经保存了,要么所有修改都不保存。

这正是数据库区别于文件系统的重要特性之一。

事务特性对于存储中间件是必须的吗

答案是不一定。

一些存储中间件比如Hbase,不支持事务。但对于低延时的随机读写场景特别合适。

应用场景

  • 数据库事务(本地事务)
  • 分布式事务

​数据库事务相关实现原理:

  • (1)事务日志

  • (2)并发控制

Innodb事务特性

InnoDB存储引擎事务完全符合ACID特性。

ACID,是指数据库管理系统(DBMS)在写入或更新资料的过程中,为保证事务(transaction)是正确可靠的,所必须具备的四个特性。

  • 原子性(Atomicity)

整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。

  • 一致性(Consistency)

一个事务可以封装状态改变(除非它是一个只读的)。

事务必须保证系统始终处于一致的状态,不管在任何给定的时间里,并发事务有多少。也就是说:如果事务是并发多个,系统也必须如同串行事务一样操作。其主要特征是保护性和不变性。

以转账案例为例,假设有五个账户,每个账户余额是100元,那么五个账户总额是500元,如果在这个5个账户之间同时发生多个转账,无论并发多少个,比如在A与B账户之间转账5元,在C与D账户之间转账10元,在B与E之间转账15元,五个账户总额也应该还是500元,这就是保护性和不变性。

  • 隔离性(Isolation)

在并发环境中,并发的事务是相互隔离的,一个事务的执行不能被其他事务干扰。

也就是说,不同的事务并发操纵相同的数据时,每个事务都有各自完整的数据空间,即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。

  • 持久性(Durability)

在事务完成以后,该事务对数据所作的更改便持久的保存,并不会被回滚。

隔离性下的隔离级别

  • 读未提交

读到别人还没提交的记录,容易引起脏读。

  • 读已提交

读到别人已经提交的记录,容易引发幻读。

幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。

引出一个思考题:阿里在部分场景下修改了MySQL默认隔离级别为:读已提交。 大家觉得是出于什么原因考虑?

  • 可重复读

这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行

  • 串行化