什么是事务的隔离性?
两个人同时在一个画本上画画,过程中你一笔我一笔,那么最后最后画出来的一定是一个四不像,多个事务同时操作一个数据也会和上面的情况类似,所以为了让不同的事务之间相互不存在干扰,就需要对事务的操作进行隔离,事务的隔离性也就是将操作同一个数据的事务相互分离,让操作之间分开有序的执行。
如果不对事务进行隔离会有哪些问题?
在数据库中,如果多个事务可以同时操作一个数据,那么就会产生脏读、重复读、幻读的问题。
脏读
出现原因:修改数据的同时可以读取数据;
案例: 以存款为例,假设A与B同用一张银行卡,银行卡内余额为1000。
操作: 如下图所示,当事务B对余额进行了修改但是未提交事务,此时事务A对银行卡余额进行读取,并且在这个 数据的基础上进行业务操作,进行存款,结果会导致最终的银行卡余额出现问题 ;
![928a34c0bd2161e384c3ea737714aa0e.png](https://i-blog.csdnimg.cn/blog_migrate/cdf7d9e9fd51811f6b76b11385d332e9.png)
重复读
出现原因: 读取数据的同时可以进行修改;
案例: 以取款为例,假设A与B同用一张银行卡,银行卡内余额为1000。
操作: 如下图所示,事务A,事务B同时对余额进行访问,事务A对余额进行读取,事务B对余额进行修改,当事 务A第一次对余额进行读取后,此时事务B提交,那么当事务A第二次读取该数据时的数据就与第一次读 取的数据不同,这种情况称为可重复读;
![d609535fe16d136dac3a9ce88382ffc2.png](https://i-blog.csdnimg.cn/blog_migrate/1fa6cd691a291191fa8abd7cb069ac16.png)
幻读
出现原因:读取和修改的时候可以insert数据;
案例: 以打印银行卡账单存款记录为例,假设A与B同用一张银行卡,银行卡内存款记录为两条。
操作: 如下图所示,存款表有2条数据,A对存款表进行读取, 当A第一次读取到存款记录的时候只有2条数据; 但是与此同时B往银行卡进行了一笔存款然后提交了事务,在B提交了存款事务之后,A执行了打印操 作,最后发现打印存款表信息的时候却发现有3条数据,与之前查出的数据不一样,这种平白无故多出来 的数据就好象发生了幻觉一样所以称为幻读;
![58c17a41b3aabe7ed562d7f398e8b821.png](https://i-blog.csdnimg.cn/blog_migrate/b5a5d3c27036ccc39076aed61369ef13.png)
事务的四种级别
就像上面所说的,如果不对事务进行隔离那么势必就会产生很多问题,所以就需要一种机制来对不同事务间的操作进行隔离,让彼此之间相互不影响,数据库对事务隔离设置有四种程度的级别,分别为读未提交、读提交、重复读、序列化;级别依次从低倒高,级别越高事务的之间的隔离操作就越严格,当然要求越严格其性能也会越低。
READ_UNCOMMITTED(读未提交)
这种情况只限制了两个数据不能同时修改,但是修改数据的时候是可以读取的,这级别的事务隔离有脏读、重复读、幻读的问题;
READ_COMMITTED(读提交)
这种隔离级别的事务限制了修改数据的时候不允许读取,但是读取数据的时候是可以进行修改的,所以这种事务的隔离级别解决了脏读问题,但会存在重复读、幻读问题;
REPEATABLE_READ(重复读)
这种隔离级别的事务限制了读取数据的时候也不可以进行修改,所以解决了重复读的问题,但是读取范围数据的时候可以插入数据,所以还会存在幻读问题;
SERIALIZABLE (序列化)
事务最高隔离级别,在该级别下,所有事务都是进行串行化顺序执行,这样就可以避免脏读、不可重复读与幻读所有问题了。但是这种事务隔离级别下事务执行的效率低下,比较耗数据库性能。