.1.事务是干啥,核心是为了解决数据库的原子性~~回滚
2.事务的特性
(1)原子性(最核心的性质)
事务的根本所在(事务存在的意义),能把多个SQL语句打包成一个整体,要么都执行完,要么一个都不执行.(如果执行的过程中出错误,则自动回滚).
(2)一致性
事务前后执行后,数据保持"一致性".
(3)持久性
事务在执行后,读写在硬盘中,不会随着重启/关机而丢失.
(4)隔离性(面试中重要的问题)
隔离性存在的意义就是并发执行事务的时候,尽量不出现问题.
隔离性中有三个问题
1.脏读
A事务在修改数据,提交之前,B事务读取了数据,此时A事务提交的时候可能提交的是不同的数据(A修改了数据),这时B读取就是脏数据指的是无效的数据.
解决方法
A同学与B同学商量了一下A在修改的过程中B同学无法进行读取,在A同学提交后B同学才能进行读,这就加了一个锁称为写锁.
2.不可重复读
A事务多次读取同一个数剧,发现数据不一样
A同学在进行读取的时候,B同学对数据进行了修改,A同学读着读着发现数据改变了.
解决办法
两个同学商量,A同学在读取的时候,B同学不能对数据进行修改,A同学读完了B同学才能修改数据,这就加了一个锁,称为读锁.
3.幻读
幻读是一种特殊的不可重复读
A同学在读取Helloword.java文件时B同学在Test.java文件上进行修改,A同学读完Helloword.java文件后发现结果集发生了改变,但是并没有影响自己读取文件,这种情况就叫做幻读.
解决办法
串行化,一个一个事务来完成,事务A完全完成后才能进行事务B.
上述每次加一个锁,并发程度降低了(效率降低)但是隔离性提高了(指数据的准确性提高了)
Mysql提供给我们"隔离级别的选型",给了四个档位,根据不同的需求来选择不同的档位.
1.read uncommitted 允许读未提交的数据,并发性最高,隔离性最低,可能存在脏读/不可重复读/幻读
2.read committed 只能读取提交后的事务,相当于写加锁,并发程度降低,隔离性提高,可能存在不可重复读/幻读
3.repeatable read(默认状态)加上了写锁和读锁,并发程度再次降低,隔离性提高,可能存在幻读
4.serializable 严格执行串行化,并发程度最低,隔离性最高,解决了脏读/不可重复读/幻读问题,效率最低.