隔离性
隔离性,事务的基本特征之一。
防止数据库在并发处理时出现数据不一致的情况
严格情况下,使用串行化的方法执行每一个事务,事务之前互相独立,不存在并发。
生产环境,存在大规模并发访问的情况,需要更高吞吐量,串行化无法满足高并发访问需求,需要降低隔离标准,换取事务之间的并发能力。
牺牲一定的正确性来换取效率的提升,也就是说,我们需要通过设置不同的隔离等级,以便在正确性和效率之间进行平衡
对数据库隔离级别进行定义,说明这些隔离标准都解决了哪些问题
不可重复读是同一条记录的内容被修改了,重点在于UPDATE或DELETE
幻读是查询某一个范围的数据行变多了或者少了,重点在于INSERT
事务并发处理的异常
不对事务进行隔离操作,并发会出现什么情况
1.脏读(Dirty Read)
读到了其他事务还没有提交的数据
2.不可重复读(Nnrepeatable Read)
对数据进行读取,两次读取的结果不同,读到了不同的内容,其他事务对这个数据进行了修改
在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。
3.幻读(Phantom Read)
A根据条件查询得到了N条数据,此时事务B更改增加了M条符合A查询条件的数据,再次查询,发现有了N+M条数据,产生了幻读。
事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
事务隔离的级别
解决异常数量从少到多的顺序
脏读 不可重复读 幻读
读未提交 允许 允许 允许
读已提交 禁止 允许 允许
可重复读 禁止 禁止 允许
可串行化 禁止 禁止 禁止
读未提交 允许读到未提交的数据,查询是不用锁的,脏读、幻读、不可重复读都会出现
读已提交 只能读到已经提交的内容,避免了脏读的产生,常见默认隔离级别,为了避免不可重复读和幻读,需要编写加锁的SQL语句。
可重复度,保证一个事务在相同查询条件下两次查询到的数据结果是一致得,可以避免不可重复读和脏读,无法避免幻读。MySQL默认
可串行化,将事务进行串行化,也就是在一个队列中按照顺序执行,可串行化是最高级别的隔离等级,可以解决事务读取中所有可能出现的异常情况,但是它牺牲了系统的并发性。