数据库事务的四大特性和事务隔离级别以及脏读
Posted yang--tao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库事务的四大特性和事务隔离级别以及脏读相关的知识,希望对你有一定的参考价值。
1、事务是什么
事务是应用程序中一系列严密的操作,所有操作必须全部成功完成才算完成这个事务,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。
2、事务的四大特性
数据库事务 transanction 正确执行的四个基本要素。ACID,原子性(Atomicity)、一致性(Correspondence)、隔离
性(Isolation)、持久性(Durability)。
1)原子性:
整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
2)一致性:
原子性中规定方法中的操作都执行或者都不执行,但并没有说要所有操作一起执行(一起更新那就乱套了,要哪个结果?),所以操作的执行也是有先后顺序的,那我们要是在执行一半时查询了数据 库,那我们会得到中间的更新的属性?答案是不会的,一致性规定事务提交前后只存在两个状态,提交前的状态和提交后的状态,绝对不会出现中间的状态。在事务开始之前和事务结束以后,数据库的完整性 约束没有被破坏。
3)隔离性:
事务的隔离性基于原子性和一致性,每一个事务可以并发执行,但是他们互不干扰,但是也有可能不同的事务会操作同一个资源,这个时候为了保持隔离性会用到锁方案。
4)持久性:
指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,哪怕是提交后刚写入一半数据到数据库中,数据库宕机(死机)了,那当你下次重启的时候数据库也会根据提交日志进行回滚,最终将全部的数据写入。
3、事务的隔离级别(默认事务级别为可重复读)
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
1)如何查询和设置数据库当前事务隔离级别
在mysql数据库中查看当前事务的隔离级别:
select @@tx_isolation;
在MySQL数据库中设置事务的隔离级别:
set [glogal | session] transaction isolation level 隔离级别名称; set tx_isolation=’隔离级别名称;’
4、数据概念
脏数:指在一个事务处理过程里读取了另一个未提交的事务中的数据。也就是说,一个事务正在对一条记录做修改,在这个事务完成并提交之前,这条数据是处于待定状态的(可能提交也可能回滚),这时,第二个事务来读取这条没有提交的数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被称为脏读。
如:
公司发工资了,领导把5000元打到singo的账号上,但是该事务并未提交,而singo正好去查看账户,发现工资已经到账,是5000元整,非常高 兴。可是不幸的是,领导发现发给singo的工资金额不对,是2000元,于是迅速回滚了事务,修改金额后,将事务提交,最后singo实际的工资只有 2000元,singo空欢喜一场。
不可重复读:一个事务先后读取同一条记录,而事务在两次读取之间该数据被其它事务所修改,则两次读取的数据不同,我们称之为不可重复读。
如:singo拿着工资卡去消费,系统读取到卡里确实有2000元,而此时她的老婆也正好在网上转账,把singo工资卡的2000元转到另一账户,并在 singo之前提交了事务,当singo扣款时,系统检查到singo的工资卡已经没有钱,扣款失败,singo十分纳闷,明明卡里有钱,为 何......
幻读:事务非独立执行时发生的一种现象。一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为幻读。
如:singo的老婆工作在银行部门,她时常通过银行内部系统查看singo的信用卡消费记录。有一天,她正在查询到singo当月信用卡的总消费金额 (select sum(amount) from transaction where month = 本月)为80元,而singo此时正好在外面胡吃海塞后在收银台买单,消费1000元,即新增了一条1000元的消费记录(insert transaction ... ),并提交了事务,随后singo的老婆将singo当月信用卡消费的明细打印到A4纸上,却发现消费总额为1080元,singo的老婆很诧异,以为出 现了幻觉,幻读就这样产生了。
如:第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
个人总结:
把事务比作一个游戏,而完成这个事务就像是这个游戏通关,而在通关的过程中的一系列操作这就是事务。
事务的四大特性:
原子性:整个事务中的所有操作,要么全部完成,要么全部不完成。
一致性:事务是操作数据库的,事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
隔离性:每个事务是互不干扰的,但是也有可能不同的事务会操作同一个资源,这个时候为了保持隔离性会用到锁方案。
持久性:一个事务一旦被提交了,那么就会永久性的改变数据库中的数据,哪怕是在提交之后出现问题,如数据库死机之类的,那当你下次重启的时候数据库也会根据提交的日志进行回滚,最终将全部的数据写入。
至于事务的隔离级别和脏读、不可重复读、幻读,我个人感觉上面已经写的很明白了。
如果有什么问题欢迎各位提出来!
以上是关于数据库事务的四大特性和事务隔离级别以及脏读的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 基础 事务 -- 事务简介事务操作事务四大特性(原子性一致性隔离性持久性)并发事务问题(不可重复读脏读幻读)事务隔离级别(解决并发事务问题)