mybatis的几种锁

因为对于mysql的锁机制了解的并不深刻,因此翻阅了资料,整理一下本身所理解的锁。以mysql数据库的InnoDB引擎为例,由于InnoDB支持事务、行锁、表锁;且如今大部分公司使用的都是InnoDB。html

mysql锁的使用离不开事务的,因此咱们先上点简单的理论,了解一下事务。mysql

1.数据库事务

事务的基本要素(ACID)sql

1.原子性(Atomicity):事务开始后全部操做,要么所有作完,要么所有不作,不可能停滞在中间环节。事务执行过程当中出错,会回滚到事务开始前的状态,全部的操做就像没有发生同样。也就是说事务是一个不可分割的总体,就像化学中学过的原子,是物质构成的基本单位。数据库

2.一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。好比A向B转帐,不可能A扣了钱,B却没收到。
ide

3.隔离性(Isolation):同一时间,只容许一个事务请求同一数据,不一样的事务之间彼此没有任何干扰。好比A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转帐。spa

4.持久性(Durability):事务完成后,事务对数据库的全部更新将被保存到数据库,不能回滚。htm

2.隔离级别

事务隔离级别 脏读 不可重复读 幻读
读未提交(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索引

3.锁的分类

共享锁(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

 4.事务下锁的运行

环境配置:mysql:5.7.10 ,InnoDB引擎,事务隔离级别为:可重复读(repeatable-read)

4.1 共享锁(S)

相关文章
相关标签/搜索