本篇文章给大家带来的内容是关于mysql数据库锁机制的介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 并发控制 锁当并发事务同时访问一个资源时,有可能导致数据不一致,因此需要一种机制来将数据访问顺序化,以保证数据库数据的一致性。锁就是其中的一种机制(推荐教程:MySQL教程) 锁的分类DML锁用于保护数据的完整性,其中包括行级锁(TX锁),表级锁(TM锁)。DDL锁用于保护数据库对象的结构,如表,索引等的结构定义,其中包括排他DDL锁,共享DDL锁,可中断解析锁 行级锁表级锁页级锁Mysql常用存储引擎的锁机制MyISAM和MEMORY采用表级锁 BDB采用页级锁或表级锁,默认是页级锁 InnoDB支持行级锁和表级锁,默认为行级锁
InnoDB的行锁和表锁InnoDB引擎中既支持行锁也支持表锁,那么什么时候会锁住整张表,什么时候锁住一行?? 行级锁和死锁MyISAM是不会产生死锁的,因为MyISAM总是一次性获得所需的全部锁,要么全部满足,要么全部等待。而在InnoDB中,锁是逐步获得的,就造成死锁的可能 在MySQL中,行级锁并不是直接锁纪录,而是锁索引。索引分为主键索引和非主键索引两种,如果一条sql语句操作了主键索引,MySQL就会锁住这条主键索引;如果一条语句操作了非主键索引,MySQL就会先锁定该非主键索引,再锁定相关的主键索引。在Update,delete操作时,MySQL不仅锁定where条件扫描过的所有索引记录,而且会锁定相邻的键值,即所谓的next-key locking 死锁:当两个事务同时执行,一个锁住了主键索引,在等待其他相关索引。另一个锁定了非主键索引,在等待主键索引。这样就发生死锁。 发生死锁后,InnoDB一般都可以检测到,并使一个事务释放锁回退,另一个获取锁完成事务
避免死锁如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会 在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率 对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁
共享锁和排他锁1. 共享锁共享锁又称读锁,是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改,直到已释放所有共享锁。 如果事务T对数据A加上共享锁后,那么其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据 如果事务T对数据A加上共享锁后,又对数据进行修改,那么其他事务将不能获取共享锁;同样的,若多个事务对同一数据获取共享锁,则任何事务不能对该数据进行修改 用法: SSELECT ... LOCK IN SHARE MODE 在查询语句后面增加LOCK IN SHARE MODE,Mysql会对查询结果中的每行都加共享锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请共享锁,否则会被阻塞。其他线程也可以读取使用了共享锁的表,而且这些线程读取到的是同一个版本的数据
2. 排他锁3. 意向锁总结对于insert,update,delete,InnoDB会自动给涉及到的数据加排他锁;对于一般的Select语句,InnoDB不会加任何锁,事务可以通过以下语句给显式加上共享锁或排他锁 以上就是mysql数据库锁机制的介绍的详细内容,更多请关注模板之家(www.mb5.com.cn)其它相关文章! |