我们都知道事务具有四大特征(原子性、一致性、隔离性、持久性),此篇博客我们将对其隔离性进行更加深层次的理解
1.隔离性的目的在于使客户端从mysql服务器中对事务进行的操作相互之间不产生影响,但不同的应用场景对其隔离性的要求有所不同。由此我们要介绍的是隔离等级
1.1隔离等级
下面四个隔离等级为由低到高
read uncommitted : 读未提交
read committed: 读已提交
repaeteble read: 可重复读
serializable: 串行化
隔离级别从低到高,“并发访问”的数据从高到低,数据安全性从低到高,性能越低
MYSQL默认的事务隔离级别是,可重复读
下面将展示有关隔离等级的sql代码:
在不同隔离等级下会产生不同隔离级别的现象:(我们将结合实例对其进行解释)
1.脏读:
脏读产生于read uncommitted : 读未提交 的隔离等级下
脏读的现象会出现在如下情况:当我们进行A事务中数据的修改过程时,此时我们并没有对数据进行提交或者回滚操作,而此时B事务恰好同样对同样的数据进行读取操作,这是所读取的是A中操作中的数据,而后来事务A发现它所修改的数据错误进行了回滚操作,而B不知道这是错误的数据,对读取到的数据进行操作,可能会产生错误。
那么该如何解决脏读的问题呢?
我们采用在进行写操作时进行加锁,即在进行写操作时不允许我们在此期间进行读取数据的操作,
这把锁我们称为写锁,写锁具有排他性(不允许其他操作的同时执行)
加上写锁就意味着我们的隔离等级进入了第二个阶段:read committed: 读已提交
2.不可重复读
这种现象出现于read committed: 读已提交的隔离等级下:
这种现象的意思如下:当我们A事务想要去读取数据,在A事务第一次读取结束之后 ,此时恰好B事务对这些数据进行了修改,此时A事务前后两次所读取的数据也就不同了,我们称这种现象为不可重复读
我们此时的解决方式如下:我们在进行读取操作时,加一把读锁,但是读锁是一把共享锁,也就意味着我们允许很多把读锁进行共同读取数据,但由于写锁是排他锁,,所以在读取数据期间不允许写入数据
这样我们隔离等级也进入了第三个阶段:repaeteble read: 可重复读,而事务默认的隔离等级也是这个等级
3.幻读:在不可重复读的问题解决后,我们对一组数据进行读或者写时,我们不能同时对他进行写或者读的操作(读不能写,写不能读),但是如果我们此时事务A对符合一定条件的数据进行查找时,此时B事务恰好对其中某组符合条件的数据进行修改,我们此时发现事务A第一次查找与第二次查找的结果集不相符,我们称这种现象为幻读
解决方式则是我们进行串行化操作:在事务A进行操作时,不允许另一个事务加入操作直到事务A结束操作
总结:我们对隔离等级进行规范,目的是要实现数据安全性要求的满足,而安全性越高,意味着我们对数据进行操作的并发性(允许多个事务同时操作)和效率也就越低