如何理解事务
一、事务是干啥的
- 事务指逻辑上的一组操作,组成这组操作的各个单元,事务最核心的就是原子性,要么全部成功,要么全部失败(不是说真的没执行,而是执行一半如果出现问题,能够自动恢复如初)。事务就能保证,在执行过程中出现问题的时候,自动的把前面的SQL执行的效果,进行还原,恢复如初~~(回滚roolback)
二、事务的其他特性还有啥
- 原子性:事务的根本所在(事物存在的意义),能够把多个SQL打包成一个整体,要么都执行完,要么一个都不执行(如果执行过程中出错,则自动回滚)
- 一致性:事务执行前后,数据处在“一致”的状态(数据能对的上,合情合理)
- 持久性:事务进行的改动,都是写到硬盘里的,不会随着程序的重启/主机重启而丢失
- 隔离性:多个事务,并发执行的时候,事物之间能偶保持“隔离”,不相互干扰
三、在并发执行事务下会有哪些问题,以及如何解决(重点隔离性)
-
脏读:一个事务A在修改数据,提交之前,另一个事务B读取了数据,此时A极有可能在提交的时候提交的是不同数据(后续又修改了),此时事务B读到的数据就是“无效的数据”,就称为脏读,读取脏数据。
⭐如何解决:在提交之前不能读,提交之后才能读。相当于是对写操作加锁。(并发现降低(效率降低),隔离性提高(准确性提高))
-
不可重复读:在一个事务A中,多次读取同一个数据,发现不一样!!(读的过程中被人修改了)
⭐如何解决:使用读加锁解决,读的时候不修改。并发现又进一步的降低(效率降低),隔离性又提高(准确性提高))
-
幻读:读文件A的时候,去修改文件B~~,只要不影响到大家正在读的那个数据就行了,虽然对于直接读取的数据没影响,但是会发现两次读虽然关心的数据一样,但是结果集变了(第一次看到的只有一个.java文件,下次读的时候突然就是两个.java文件了)
⭐如何解决:串行化。此时并发程度最低了(串行执行的了),效率是最低的,隔离性最高了,数据的准确性最高了。
4、mysql的隔离级别有哪些,和上面的问题如何应对
- [ ⭐] mysql给我们提供了“隔离级别”选项,给了四个挡位,可以根据实际的需求,选择不同的挡位
- read uncommitted:允许读未提交的数据,并发程度最高,隔离性最低。可能存在脏读/不可重复读/幻读问题;
- read committed:只能读提交之后的数据,相当于写加锁,并发程度降低,隔离性提高。解决了脏读,可能存在不可重复读/幻读问题;
- repeatable read:相当于读和写都加锁了,并发程度再降低,隔离性再提高。解决了脏读/不可重复复,可能存在幻读问题;
- serializable:严格执行串行化,并发程度最低,隔离性最高。解决了脏读/不可重复读/幻读问题,效率最低。