今天在使用数据库的时候,接触到了事务,这也是面试中常问的问题,于是写了这篇笔记记录一下
事务的四大特性
事务的四大特性简称ACID
1原子性(Atomicity)
原子性是指事务的所有操作要么一起成功,要么一起失败,不能中断
比如你转账给别人,你这边扣了钱,别人也要收到钱
2一致性(Consistency)
一致性指的是事务在操作前后,数据库的数据需要保持前后一致
比如你和你爸金额的钱一共1000,你爸不管转账给你多少钱,你们的钱加起来还是1000
3隔离性(Isolation)
隔离性指的是一个事务在对同一个数据操作的时候是不受其他的事务影响的,每个事务都隔离起来,特别是在高并发的情况下,关于隔离级别下文会有介绍
4持久性(Durability)
持久性指的是事务对数据库进行操作了事务提交了,不管是什么操作,只要操作了都会保存到数据库中,不能回滚
比如你在公司中接收任务,你会拿一些实质的东西记录下是某个领导给你派的任务,就算那个领导忘记了到时候你也有证据可以查看
事务的隔离性和隔离级别
介绍完上面的四大特性,现在专门来讲一下隔离性
如果不考虑隔离性的话会出现以下问题:
1脏读
脏读指的是一个事务读取了另一个事务没有提交的数据,没有提交就代表还有更改的可能,所以这部分数据很大的可能会是脏数据
2不可重复读
不可重复读指的是事务在多次访问同一份数据的时候,读取到的数据内容并不相同,这是因为在多次读取的期间有其他事务更改了数据并提交了
很多时候不可重复读并不是问题,只要拿到最后读取到的数据就可以了
3幻读
幻读指的是一个事务多次读取同一份数据的时候,读取到的数据数量不一致,类似出现了幻觉
不可重复读的重点在于update和delete,幻读重点在于insert
隔离级别
有了以上的问题就需要有解决的方法,有4种隔离级别去解决
1.读未提交(Read Uncommitted):最低级别,以上的问题都解决不了
2.读已提交(Read Committed): 可以解决脏读的问题
3.可重复读(Repeatable Read):确保事务在多次读取一份数据的时候,其他事务不能对这份数据进行修改,可以解决脏读和不可重复读的问题
4.串行化(Serializable):级别最高,所有事务不可并发执行,只能串行,可以解决脏读,不可重复读,幻读三个问题
以上四种隔离级别串行化的级别最高,但是它的性能也是最低的,凡事都有两面性,隔离级别越高越能保持数据的完整性和一致性,但是就需要牺牲性能,所以在选择隔离级别的时候就需要慎重选择,很多情况只需要读已提交的隔离级别即可,而MySQL中默认的隔离级别可重复读