数据库的隔离级别
MySQL的事务隔离级别一共有四个,分别是读未提交、读已提交、可重复读以及可串行化。
MySQL的隔离级别的作用就是让事务之间互相隔离,互不影响,这样可以保证事务的一致性。
隔离级别比较:可串行化>可重复读>读已提交>读未提交
隔离级别对性能的影响比较:可串行化>可重复读>读已提交>读未提交
读未提交(READ UNCOMMITTED):在读未提交隔离级别下,A可以读取到B修改过但未提交的数据。(该级别隔离的数据库可能发生脏读、不可重复读和幻读问题,一般很少使用此隔离级别。)
脏读(Dirty Read):一个事物读到另一个未提交事物修改过的数据。
举例:过年了,老板准备给公司的每个员工发奖金。老板准备给小刚发2000元的奖金但是由于输入错误输入的是5000元,但是还未提交转账。这时小刚刚好看自己今年的奖金额度为5000一下子高兴坏了。连忙和自己好友小明分享还决定下班请小明喝奶茶,下班后老板宣布大家的奖金都发用户卡里了,小刚连忙打开手机一看银行卡收款2000元,一下子有点失落。
读已提交(READ COMMITTED):在读已提交隔离级别下,B只能在A修改过并且已提交后才能读取到事务B修改的数据。(解决了脏读的问题,但可能发生不可重复读和幻读问题,一般很少使用此隔离级别。)
幻读(Phantom):一个事务先根据某些条件查询出一些记录,之后另一个事务又向表中插入了符合这些条件的记录,原先的事务再次按照该条件查询时,能把另一个事务插入的记录也读出来。(幻读在读未提交、读已提交、可重复读隔离级别都可能会出现)
举例:小刚还是请小明去奶茶店喝了奶茶,但是由于小明的奖金比小刚多,结果小明给小刚买了单一个23元。小明回到家和老婆说他发了工资和奖金一共有34210元,刚刚和好友小刚喝奶茶花了23元还剩34187元,并把银行卡消费记录给老婆看,就在这时小刚想着不行明明就是他说要请小明喝奶茶的,于是决定要把钱发给小明,但是发微信怕他不收结果就直接支付宝转账,这时小明老婆看到的账单中突然又多了一个转账收款23元。
不可重复读:(Non-Repeatable Read):一个事务只能读到另一个已经提交的事务修改过的数据,并且其他事务每对该数据进行一次修改并提交后,该事务都能查询得到最新值。(不可重复读在读未提交和读已提交隔离级别都可能会出现)
**可重复读REPEATABLE READ):**在可重复读隔离级别下,事务B只能在事务A修改过数据并提交后,自己也提交事务后,才能读取到事务B修改的数据。
可串行化(序列化)(SERIALIZABLE):各种问题(脏读、不可重复读、幻读)都不会发生,通过加锁实现(读锁和写锁)。
总结:
·Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
·Repeatable read (可重复读):可避免脏读、不可重复读的发生。
·Read committed (读已提交):可避免脏读的发生。
·Read uncommitted (读未提交):最低级别,任何情况都无法保证。
以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,级别越高,执行效率就越低。
: