# 数据库并发问题 ## 多事务运行时的并发问题 ### 第一类丢失跟新 撤销一个事务时,把其他事务已提交的跟新数据覆盖 ### 脏读 一个事务读到另一个事务未提交的跟新数据 ### 虚读 一个事务读到另一个事务已提交的新插入的数据; ### 不可重新读 一个事务读到另一个事务已提交的跟新数据; ### 第二类丢失跟新 这是不可重复读中的特例,一个事务覆盖另一个事务已提交的跟新数据。 ## 数据库锁
资源上已放置的锁 第二个事务读操作 第二个食物跟新操作
立即获取锁 立即获取锁
共享锁 立即获取共享锁 等待第一个事务解除共享锁
独占锁 等待第一个事务解除独占锁 等待第一个事务解除独占锁
## 共享锁 用于读数据操作,他是非独占的,允许其他事务同时读取其锁定的资源,但不允许其他事务更新他。 1. 加锁条件:当一个事务执行select语句时。 2. 解锁条件:默认情况下,数据读取后,数据库系统立即释放共享锁。 3. 兼容性:放置共享锁后还可放置共享锁和更新锁。 4. 并发性:具有良好的并发性能。当多个事务读取相同的数据时,每个事务都会获得一把共享锁,因此可以同时读锁定的数据。 ## 独占锁 也叫排他锁,使用与修改数据的场合。他锁定的资源,其他事务不能进行读写。 1. 加锁条件:当一个事务执行insert,update,delete时,数据库系统会自动对被操作的数据使用独占锁。如果该数据已有其他锁存在,则不能放置独占锁。 2. 解锁条件:事务结束。 3. 兼容性:不和其他锁兼容。 4. 并发性:并发性差,只允许有一个事务访问锁定数据。其他事务需等待,直到当前事务结束。 ## 跟新锁 更新操作的初始阶段用来锁定可以能要被修改资源的锁。更新锁可避免使用共享锁造成的死锁现象。 1. 加锁条件:当执行update时,数据库系统会先为事务分配一个更新锁。 2. 解锁条件:当读取数据完毕,执行更新操作时,更新锁升级为独占锁。 3. 兼容性:与共享锁兼容。一个资源可同时放置更新锁和共享锁,但只能放置一把更新锁。 4. 并发性:允许多个事务同时读锁定的资源,但不允许其他事务修改。 ## 其他锁 1. [悲观锁和乐观锁 ](http://www.hollischuang.com/archives/934)
2. [共享锁和排他锁](http://www.hollischuang.com/archives/923)
3. 意向锁
1. 意向排他锁 2. 意向共享锁 ## 推荐文章 1. [MySQL锁(InnoDB存储引擎)](http://www.jianshu.com/p/6809adb3e9e7)