前言
- 数据库是一个共享资源,为了充分利用数据库资源,发挥数据
库共享资源的特色,应该容许多个用户并行地存取数据库。但这样就会产生多个用户程序并
发存取同一数据的状况,为了不破坏一致性,因此必须提供并发控制机制。数据库
- 并发控制是以事务(transaction)为单位进行的。
何时表锁何时行锁?
- 行锁是指的innodb引擎,只有经过索引条件检索数据,InnoDB才会使用行级锁,不然,InnoDB将使用表锁。
查看表锁
#查看是否有锁表的状况
show OPEN TABLES where In_use > 0;
#拼接hyq用户的kill语句,谨慎执行。
select concat('KILL ',id,';') from
information_schema.processlist where user='hyq';
#查看当前的事务
SELECT * FROM information_schema.innodb_trx;
#查看当前锁定的事务
SELECT * FROM information_schema.innodb_locks;
#查看当前等锁的事务
SELECT * FROM information_schema.innodb_lock_waits;
查看行锁
SHOW STATUS LIKE 'innodb_row_lock%';
四种事务隔离级别
- 一个事务对某个数据对象加锁后究竞拥有什么样控制是由封锁类型决定的,基本的锁有两种,排它锁(写锁、X锁),共享锁(读锁、S锁)。二者的相容关系以下:

例子:segmentfault

未提交读(Read uncommitted)
- 未提交读是数据库事务隔离级别中最低的一种,在这种级别下,一个事务会读到另外一个事务更新后但未提交的数据,若是事务1 rollback后,那么事务2读取的数据就是脏数据,简称脏读。

已提交读(Read Committed)
- 只能读取到已经提交的数据。在事务1内,屡次读同一数据,在这个事务尚未结束时,若是事务2刚好修改了这个数据,那么,在事务1中,两次读取的数据就可能不一致。也就是说的不可重复读的问题。以下:

可重复读(Repeated Read)
- 可重复读就是屡次读取的结果都一直,而不可重复读是指,在一个事务内,屡次读同一数据,在这个事务尚未结束时,若是另外一个事务刚好修改了这个数据,那么,在第一个事务中,两次读取的数据就可能不一致。在这种状况下可能会遇到幻读的问题以下:

可串行化(Serializable )
- 可串行性是并行调度正确性的惟一准则,全部事务按照次序依次执行,所以,脏读、不可重复读、幻读都不会出现。
为保证并行调度可串行性而提供的封锁协议。所以咱们能够得出以下结论:这个事务级别的,其并行执行的结果必定是正确的,可是呢,因为串行执行,大大下降了并行度,因此通常不使用它。
并发
欢迎来公众号【侠梦的开发笔记】 一块儿交流进步