因为对于mysql的锁机制了解的并不深刻,因此翻阅了资料,整理一下本身所理解的锁。以mysql数据库的InnoDB引擎为例,由于InnoDB支持事务、行锁、表锁;且如今大部分公司使用的都是InnoDB。html
mysql锁的使用离不开事务的,因此咱们先上点简单的理论,了解一下事务。mysql
事务的基本要素(ACID)sql
1.原子性(Atomicity):事务开始后全部操做,要么所有作完,要么所有不作,不可能停滞在中间环节。事务执行过程当中出错,会回滚到事务开始前的状态,全部的操做就像没有发生同样。也就是说事务是一个不可分割的总体,就像化学中学过的原子,是物质构成的基本单位。数据库
2.一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。好比A向B转帐,不可能A扣了钱,B却没收到。
ide
3.隔离性(Isolation):同一时间,只容许一个事务请求同一数据,不一样的事务之间彼此没有任何干扰。好比A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转帐。spa
4.持久性(Durability):事务完成后,事务对数据库的全部更新将被保存到数据库,不能回滚。htm
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交(read-uncommitted) | 是 | 是 | 是 |
不可重复读(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
mysql默认的事务隔离级别为:可重复读(repeatable-read) blog
mysql> select @@tx_isolation; +-----------------+ | @@tx_isolation | +-----------------+ | REPEATABLE-READ | +-----------------+ 1 row in set (0.00 sec)
你们能够参考这个文档,写得简单清晰:http://www.javashuo.com/article/p-xisokohk-bp.html索引
共享锁(S):容许一个事务去读一行,阻止其余事务得到相同数据集的排他锁。事务
排他锁(X):容许得到排他锁的事务更新数据,阻止其余事务取得相同数据集的共享读锁和排他写锁。
意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。
意向排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。
说明:
1)共享锁和排他锁都是行锁,意向锁都是表锁,应用中咱们只会使用到共享锁和排他锁,意向锁是mysql内部使用的,不须要用户干预。
2)对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X);
对于普通SELECT语句,InnoDB不会加任何锁,事务能够经过如下语句显示给记录集加共享锁或排他锁。
共享锁(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE。
排他锁(X):SELECT * FROM table_name WHERE ... FOR UPDATE。
3)InnoDB行锁是经过给索引上的索引项加锁来实现的,所以InnoDB这种行锁实现特色意味着:只有经过索引条件检索数据,InnoDB才使用行级锁,不然,InnoDB将使用表锁!
参考文档:http://www.javashuo.com/article/p-ayjigvpr-eq.html
环境配置:mysql:5.7.10 ,InnoDB引擎,事务隔离级别为:可重复读(repeatable-read)