【隔离级别】
MySQL默认的隔离级别是可重复读
在sql中定义了四种隔离级别:
READ UNCOMMITED(未提交读)事务之间的数据时相互可见的
READ COMMITED(提交读)大多数数据库的默认隔离级别,保证了不可能脏读,但是不能保证可重复读,在这个级别里,数据的加锁实现是读取都是不加锁的,但是数据的
写入,修改和删除是需要加锁的
REPEATABLE READ(可重复读)解决了不可重复读的问题,保证了在同一个事务中,多次读取相同的记录的值得结果是一致的.但是无法解决幻读。这个阶段的事务隔离性,
在mysql中是通过基于乐观锁原理的多版本控制实现的
SERIALIZABLE(可串行化读)最高的隔离级别,解决了幻读,它会在读取的每一行数据上都进行加锁,有可能导致超时和锁争用的问题;
它的加锁实现是读取的时候加共享锁,修改删除更新的时候加排他锁,读写互斥,但是并发能力差
【数据一致性】
事务:用于保证数据库的一致性
数据一致性:就是当多个用户试图同时访问一个数据库,它们的事务同时使用相同的数据时,可能会发生以下四种情况:丢失更新、脏读、不可重复读、幻读
【丢失更新】
当两个或者多个事务同时对某一个数据进行更新的时候。事务B的更新可能覆盖掉事务A的更新,导致更新丢失
··解决方法:悲观锁的方式:加锁,建议最后一步更新数据的时候加上排他锁,加锁后,首先做一下加锁的查询确认数据有没有改变,如果没有,则进行数据更新
否则失败。一定要做加锁的查询确认,否则你不加锁的话,有可能你在做确认的时候数据又发生了改变.
··乐观锁的方式:使用版本控制实现
【脏读】
事务可以读取未提交的数据,
比如:事务A对一个数据data=1000,进行修改:data=2000,但是还没提交;
事务B读取data,得到了结果data=2000;
事务A撤销了刚才的操作,数据data=1000,然后提交
这时事务B读取到的2000就是脏数据。正确的还应该是1000.
解决方法:把数据库的事务隔离级别调整到READ_COMMITTED
【不可重复读】
在同一个事务中,多次读取相同的记录的值得结果是不一样的,针对的是数据的修改和删除
比如:事务A 读取data=1000,事务还没完成;
事务B修改了data=2000,修改完毕事务提交;
事务A 再次读取data,发现data=2000了,与以前读取的不一致
解决方法:把数据库的事务隔离级别调整到REPEATABLE READ ,读取时不允许其他事务修改该数据,不管数据在事务过程读取多少次,数据都是一致的,避免了不可重复读
【幻读】
当某个事务在读取某个范围内的记录的时候,另一个事务在这个范围内增加了一行,当前一个事务再次读取该范围的数据的时候就会发生幻行,针对的是
数据的insert
解决方案:采用的是范围锁RangeS RangeS_S模式,锁定检索范围为只读或者把数据库的隔离级别调整到SERIALIZABLE_READ,MySQL中InnoDB和XtraDB利用(多版本并发控制)
解决了幻读问题