wordpress discuz整合,seo下拉优化,wordpress搭建超详细,哪些公司做外贸网站好云栖号资讯#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯#xff0c;还在等什么#xff0c;快来#xff01; MySQL中的锁机制,按粒度分为行级锁,页级锁,表级锁#xff0c;其中按用法还分为共享锁和排他锁.
行级锁
行级锁是Mysql中锁… 云栖号资讯【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯还在等什么快来 MySQL中的锁机制,按粒度分为行级锁,页级锁,表级锁其中按用法还分为共享锁和排他锁.
行级锁
行级锁是Mysql中锁定粒度最细的一种锁表示只针对当前操作的行进行加锁。
行级锁能大大减少数据库操作的冲突。其加锁粒度最小但加锁的开销也最大。行级锁分为共享锁和排他锁.
特点
开销大加锁慢会出现死锁锁定粒度最小发生锁冲突的概率最低并发度也最高。
用法
共享锁(s 锁 读锁) 表级锁
表级锁是MySQL中锁定粒度最大的一种锁表示对当前操作的整张表加锁它实现简单资源消耗较少被大部分MySQL引擎支持。
最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为共享锁和排他锁.
特点
开销小加锁快不会出现死锁锁定粒度大发出锁冲突的概率最高并发度最低。
用法
共享锁(s 锁 读锁) 页级锁
页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。
表级锁速度快但冲突多行级冲突少但速度慢。所以取了折衷的页级一次锁定相邻的一组记录。BDB支持页级锁
特点
开销和加锁时间界于表锁和行锁之间会出现死锁锁定粒度界于表锁和行锁之间并发度一般。
乐观锁和悲观锁的思想
在数据库的锁机制中介绍过数据库管理系统DBMS中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。
乐观并发控制(乐观锁)和悲观并发控制悲观锁是并发控制主要采用的技术手段。
无论是悲观锁还是乐观锁都是人们定义出来的概念可以认为是一种思想。
其实不仅仅是关系型数据库系统中有乐观锁和悲观锁的概念像memcache、hibernate、tair等都有类似的概念。
针对于不同的业务场景应该选用不同的并发控制方式。所以不要把乐观并发控制和悲观并发控制狭义的理解为DBMS中的概念更不要把他们和数据中提供的锁机制行锁、表锁、排他锁、共享锁混为一谈。其实在DBMS中悲观锁正是利用数据库本身提供的锁机制来实现的。
悲观锁
在关系数据库管理系统里悲观并发控制又名“悲观锁”Pessimistic Concurrency Control缩写“PCC”是一种并发控制的方法。它可以阻止一个事务以影响其他用户的方式来修改数据。
如果一个事务执行的操作都某行数据应用了锁那只有当这个事务把锁释放其他事务才能够执行与该锁冲突的操作。
悲观并发控制主要用于数据争用激烈的环境以及发生并发冲突时使用锁保护数据的成本要低于回滚事务的成本的环境中。
悲观锁正如其名它指的是对数据被外界包括本系统当前的其他事务以及来自外部系统的事务处理修改持保守态度(悲观)
因此在整个数据处理过程中将数据处于锁定状态。
悲观锁的实现往往依靠数据库提供的锁机制 也只有数据库层提供的锁机制才能真正保证数据访问的排他性否则即使在本系统中实现了加锁机制也无法保证外部系统不会修改数据
在数据库中悲观锁的流程如下
在对任意记录进行修改前先尝试为该记录加上排他锁exclusive locking
如果加锁失败说明该记录正在被修改那么当前查询可能要等待或者抛出异常。具体响应方式由开发者根据实际需要决定。
如果成功加锁那么就可以对记录做修改事务完成后就会解锁了。
其间如果有其他对该记录做修改或加排他锁的操作都会等待我们解锁或直接抛出异常。
MySQL InnoDB中使用悲观锁
要使用悲观锁我们必须关闭mysql数据库的自动提交属性因为MySQL默认使用autocommit模式
也就是说当你执行一个更新操作后MySQL会立刻将结果进行提交。set autocommit0; 优点与不足
悲观并发控制实际上是“先取锁再访问”的保守策略为数据处理的安全提供了保证。
但是在效率方面处理加锁的机制会让数据库产生额外的开销还有增加产生死锁的机会
另外在只读型事务处理中由于不会产生冲突也没必要使用锁这样做只能增加系统负载
还有会降低了并行性一个事务如果锁定了某行数据其他事务就必须等待该事务处理完才可以处理那行数
乐观锁
在关系数据库管理系统里乐观并发控制又名“乐观锁”Optimistic Concurrency Control缩写“OCC”是一种并发控制的方法。
它假设多用户并发的事务在处理时不会彼此互相影响各事务能够在不产生锁的情况下处理各自影响的那部分数据。
在提交数据更新之前每个事务会先检查在该事务读取数据后有没有其他事务又修改了该数据。如果其他事务有更新的话正在提交的事务会进行回滚。
乐观事务控制最早是由孔祥重H.T.Kung教授提出。
乐观锁 Optimistic Locking 相对悲观锁而言乐观锁假设认为数据一般情况下不会造成冲突
所以在数据进行提交更新的时候才会正式对数据的冲突与否进行检测
如果发现冲突了则让返回用户错误的信息让用户决定如何去做。
相对于悲观锁在对数据库进行处理的时候乐观锁并不会使用数据库提供的锁机制。一般的实现乐观锁的方式就是记录数据版本。
数据版本,为数据增加的一个版本标识。当读取数据时将版本标识的值一同读出数据每更新一次同时对版本标识进行更新。
当我们提交更新的时候判断数据库表对应记录的当前版本信息与第一次取出来的版本标识进行比对如果数据库表当前版本号与第一次取出来的版本标识值相等则予以更新否则认为是过期数据。
实现数据版本有两种方式第一种是使用版本号第二种是使用时间戳。
乐观锁使用CASCompare And Swep操作保证数据一致性
使用版本号实现乐观锁
使用版本号时可以在数据初始化时指定一个版本号每次对数据的更新操作都对版本号执行1操作。并判断当前版本号是不是该数据的最新的版本号。 乐观并发控制相信事务之间的数据竞争(data race)的概率是比较小的因此尽可能直接做下去直到提交的时候才去锁定所以不会产生任何锁和死锁。
但如果直接简单这么做还是有可能会遇到不可预期的结果例如两个事务都读取了数据库的某一行经过修改以后写回数据库这时就遇到了问题。
MySQL常用存储引擎的锁机制
MyISAM和MEMORY采用表级锁(table-level locking)
BDB采用页面锁(page-level locking)或表级锁默认为页面锁
InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁
Innodb中的行锁与表锁
InnoDB行锁是通过给索引上的索引项加锁来实现的这一点MySQL与Oracle不同后者是通过在数据块中对相应数据行加锁来实现的。
InnoDB这种行锁实现特点意味着只有通过索引条件检索数据InnoDB才使用行级锁否则InnoDB将使用表锁
在实际应用中要特别注意InnoDB行锁的这一特性不然的话可能导致大量的锁冲突从而影响并发性能。
在不通过索引条件查询的时候,InnoDB 确实使用的是表锁,而不是行锁。
由于 MySQL 的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的索引键,是会出现锁冲突的。应用设计的时候要注意这一点。
当表有多个索引的时候,不同的事务可以使用不同的索引锁定不同的行,另外,不论 是使用主键索引、唯一索引或普通索引,InnoDB 都会使用行锁来对数据加锁。
即便在条件中使用了索引字段,但是否使用索引来检索数据是由 MySQL 通过判断不同 执行计划的代价来决定的,如果 MySQL 认为全表扫效率更高,比如对一些很小的表,它就不会使用索引,这种情况下 InnoDB 将使用表锁,而不是行锁。因此,在分析锁冲突时, 别忘了检查 SQL 的执行计划,以确认是否真正使用了索引。
行级锁与死锁
MyISAM中是不会产生死锁的因为MyISAM总是一次性获得所需的全部锁要么全部满足要么全部等待。
而在InnoDB中锁是逐步获得的就造成了死锁的可能。
在MySQL中行级锁并不是直接锁记录而是锁索引。
索引分为主键索引和非主键索引两种如果一条sql语句操作了主键索引MySQL就会锁定这条主键索引如果一条语句操作了非主键索引MySQL会先锁定该非主键索引再锁定相关的主键索引。
在UPDATE、DELETE操作时MySQL不仅锁定WHERE条件扫描过的所有索引记录而且会锁定相邻的键值即所谓的next-key locking。
当两个事务同时执行一个锁住了主键索引在等待其他相关索引。另一个锁定了非主键索引在等待主键索引。这样就会发生死锁。
发生死锁后InnoDB一般都可以检测到并使一个事务释放锁回退另一个获取锁完成事务。
避免死锁这里只介绍常见的三种
如果不同程序会并发存取多个表尽量约定以相同的顺序访问表可以大大降低死锁机会
在同一个事务中尽可能做到一次锁定所需要的所有资源减少死锁产生概率
对于非常容易产生死锁的业务部分可以尝试使用升级锁定颗粒度通过表级锁定来减少死锁产生的概率 【云栖号在线课堂】每天都有产品技术专家分享 课程地址https://yqh.aliyun.com/zhibo 立即加入社群与专家面对面及时了解课程最新动态 【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK 原文链接 本文为云栖社区原创内容未经允许不得转载。