1.事务是干什么的?
事务要解决的是类似与转账问题的
什么转账问题呢?
小明要给小张转500块钱,小明刚转完(即他的账户-500)时,ATM停电了系哦小张的账户上没有转入500
2.什么是事务
事务就是一系列不可分割的操作,要都执行,要么都不执行。执行的时候会满足一定的特性,避免出现上面的问题
执行时候会满足什么特性呢?这就需要知道事务的四大特性
3.事务的特性
- 原子性:一个事务是一个不可分割的工作单位,要么全都做了,要么全都不做(本质上是通过回滚操作来实现的)
- 一致性:事务执行前后,数据处于合法状态;(例如转账,小明只有300块,却要转账500,转账后变成-200,这样的操作是不允许的)
- 持久性:事务执行后,数据被持久保存(即已经存储到磁盘中)
- 隔离性:多个事务并发执行时,事务之间相互不干扰(本质上就是线程安全问题)
隔离性和并发是相悖的。
隔离是保证数据的准确,并发是保证事务的效率,隔离性越强并发度越低
4.事务并发是产生的问题
- 脏读
事务A读取到了事务B更新了但是未提交的数据,然后事务B由于某种错误发生回滚,那么事务A读取到的就是脏数据。
例如:
老师在黑板上写题,说这道题讲完就下课,写了个1+1=?小明看到这个后觉得很简单就出门上厕所了,小明出去后老师就把这道题给擦了,重写一道题,小明的这个读题操作就是脏读
解决脏读的办法:给写操作加锁,即在老师写题的时候不允许同学读黑板上的题,直到老师把题写完。
- 不可重复读
一个事务在执行过程中,两次读到的数据不相同。
例如:老师把题写完后,同学们也把题读完了,低头开始做题了,这个时候老师把题目给改了,同学们做完题抬头一看,发现题目和刚才不一样了。
解决不可重复读的办法:
同学们和老师约定好,他们在做题的时候,老师不允许改题。
即:给读操作也加个锁
- 幻读
事务A在查询完记录总数后,事务B执行了新增数据的操作,事务A再次查询记录总数,发现两次查询的结果不一致,平白无故的多了几条记录,这种现象称为幻读。
例如:老师又在黑板上加了一道题,同学做完刚才那一道,抬头后懵了,不是讲完这道下课吗?(hhhh,小明心想辛亏我跑的快hhhhhhhhh)
解决幻读的办法:
严格的串行化,即同学做题时,老师不允许修改题目,新增,删除 ,题目。
5.Mysql的隔离级别
- read uncommitted:事务中的修改,即使没有提交其他的事务也能读取数据,即读取未提交的数据,会产生脏读
- read committed:只允许读已经提交的数据,即加了写锁,会产生不可重复读的问题
- repeatable read:给读也加了锁(Mysql的默认隔离级别)会有幻读问题
- serializable:严格的串行