锁问题 | 锁问题描述 | 会出现锁问题的隔离级别 | 解决办法 |
---|---|---|---|
脏读 | 一个事务中会读到其他并发事务未提交的数据,违反了事务的隔离性; | Read Uncommitted | 提高事务隔离级别至Read Committed及以上; |
不可重复读 | 一个事务会读到其他并发事务已提交的数据,违反了数据库的一致性要求;可能出现的问题为幻读,幻读是指在同一事务下,连续执行两次同样的SQL语句可能导致不同的结果,第二次的SQL语句可能返回之前不存在的行记录; | Read Uncommitted、Read Committed | 默认的RR隔离级别下 ,解决办法分为两种情况:1、当前读:Next-Key Lock机制对相关索引记录及索引间隙加锁,防止并发事务修改数据或插入新数据到间隙;(详情参见第六章节『锁算法』)2、版本读:MVCC,保证事务执行过程中只有第一次读之前提交的修改和自己的修改可见,其他的均不可见;提高事务隔离级别至Serializable; |
丢失更新 | 见章节一中描述; | Read Uncommitted、Read Committed、Repeatable Read | 默认的RR隔离级别下 ,解决办法分为两种情况:1、乐观锁:数据表增加version字段,读取数据时记录原始version,更新数据时,比对version是否为原始version,如不等,则证明有并发事务已更新过此行数据,则可回滚事务后重试直至无并发竞争;2、悲观锁:读加排他锁,保证整个事务执行过程中,其他并发事务无法读取相关记录,直至当前事务提交或回滚释放锁;详情可参看博客:https://segmentfault.com/a/11... |
另附数据库大神博客:http://hedengcheng.com/?p=771