
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
锁的应用在许多软件编程开发项目中都得到了广泛的应用,而本文我们就通过案例分析来简单了解一下,MySQL锁的类型与加锁方式。
1、为什么要加锁?
当多个事务并发操作同一批数据的时候,如果不加锁,就无法保证事务的隔离性,后导致数据错乱。
加锁是为了保证并发操作下数据的正确性。
2、锁的分类有哪些?
按锁的粒度可分为:表锁、页面锁、行锁、记录锁、间隙锁、临键锁
按锁的属性可分为:共享锁、排它锁
按加锁机制可分为:乐观锁、悲观锁
下面依次介绍一下这几种锁:
表锁:
MyISAM和InnoDB引擎均支持表锁。
优点:开销小,加锁快,不会出现死锁。
缺点:锁定力度大,发生锁冲突概率高,并发度低。
加锁方式:
#对user表加读锁
locktableuserread;
#同时对user表加读锁,对order表加写锁
locktablesuserread,orderwrite;
什么情况下需要用到表锁?
当需要更新表中的大部分数据
事务涉及到多张表,业务逻辑复杂,加表锁可以避免死锁。
页面锁:
优点:开销和加锁速度介于表锁和行锁之间。
缺点:会出现死锁,锁定粒度介于表锁和行锁之间,并发度一般。
目前只有BDB引擎支持页面锁,应用场景较少。
行锁:
只有InnoDB引擎支持行锁,另外锁是加在索引上面的。
优点:开销大,加锁慢;会出现死锁。
缺点:锁定粒度小,发生锁冲突的概率低,并发度高。
另外记录锁、间隙锁、临键锁均属于行锁。
记录锁(RecordLocks):
即对某条记录加锁。
#对id=1的用户加锁
updateusersetage=age+1whereid=1;
间隙锁(GapLocks):
即对某个范围加锁,但是不包含范围的临界数据。
#对id大于1并且小于10的用户加锁
updateusersetage=age+1whereid>1andid<10;
上面SQL的加锁范围是(1,10)。
临键锁(Next-KeyLocks):
由记录锁和间隙锁组成,既包含记录本身又包含范围,左开右闭区间。
#对id大于1并且小于等于10的用户加锁
updateusersetage=age+1whereid>1andid<=10;
共享锁(又称读锁、S锁):
作用:防止其他事务修改当前数据。
加锁方式:
在select语句末尾加上lockinsharemode关键字。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。