mysql锁是怎么使用的 mysql锁

轻松掌握MySQL数据库锁机制的相关原理[1] 在一个update和insert操作频繁的表中 少量数据测试的时候运行良好 在实际运营中 因数据量比较大( 万条记录) 会出现死锁现象 用show processlist查看 可以看到一个update语句状态是Locked 一个delete语句状态是Sending data 查看了一下参考手册 把锁定相关的资料整理下来 以便自己记录和追踪该问题的解决情况
MySQL 支持对MyISAM和MEMORY表进行表级锁定 对BDB表进行页级锁定 对InnoDB 表进行行级锁定 在许多情况下 可以根据培训猜测应用程序使用哪类锁定类型最好 但一般很难说出某个给出的锁类型就比另一个好 一切取决于应用程序 应用程序的不同部分可能需要不同的锁类型 为了确定是否想要使用行级锁定的存储引擎 应看看应用程序做什么并且混合使用什么样的选择和更新语句 例如 大多数Web应用程序执行许多选择 而很少进行删除 只对关键字的值进行更新 并且只插入少量具体的表 基本MySQL MyISAM设置已经调节得很好
在MySQL中对于使用表级锁定的存储引擎 表锁定时不会死锁的 这通过总是在一个查询开始时立即请求所有必要的锁定并且总是以同样的顺序锁定表来管理
对WRITE MySQL使用的表锁定方法原理如下
◆ 如果在表上没有锁 在它上面放一个写锁
◆否则 把锁定请求放在写锁定队列中
对READ MySQL使用的锁定方法原理如下
◆如果在表上没有写锁定 把一个读锁定放在它上面
◆否则 把锁请求放在读锁定队列中
当一个锁定被释放时 锁定可被写锁定队列中的线程得到 然后是读锁定队列中的线程
这意味着 如果你在一个表上有许多更新 SELECT语句将等待直到没有更多的更新
如果INSERT 语句不冲突 可以自由为MyISAM 表混合并行的INSERT 和SELECT 语句而不需要锁定
InnoDB 使用行锁定 BDB 使用页锁定 对于这两种存储引擎 都可能存在死锁 这是因为 在SQL语句处理期间 InnoDB 自动获得行锁定 BDB 获得页锁定 而不是在事务启动时获得
行级锁定的优点
· 当在许多线程中访问不同的行时只存在少量锁定冲突
· 回滚时只有少量的更改
· 可以长时间锁定单一的行
行级锁定的缺点
· 比页级或表级锁定占用更多的内存
· 当在表的大部分中使用时 比页级或表级锁定速度慢 因为你必须获取更多的锁
【mysql锁是怎么使用的 mysql锁】 · 如果你在大部分数据上经常进行 GROUP BY 操作或者必须经常扫描整个表 比其它锁定明显慢很多
· 用高级别锁定 通过支持不同的类型锁定 你也可以很容易地调节应用程序 因为其锁成本小于行级锁定
在以下情况下 表锁定优先于页级或行级锁定
· 表的大部分语句用于读取
· 对严格的关键字进行读取和更新 你可以更新或删除可以用单一的读取的关键字来提取的一行
# ; UPDATE tbl_name SET column = value WHERE unique_key_col = key_value ;
# ; DELETE FROM tbl_name WHERE unique_key_col = key_value ;
· SELECT 结合并行的INSERT 语句 并且只有很少的UPDATE或 DELETE 语句
· 在整个表上有许多扫描或 GROUP BY 操作 没有任何写操作
lishixinzhi/Article/program/MySQL/201311/29594
MySQL的锁分类以及使用场景InnoDB默认是行级别的锁mysql锁是怎么使用的,当有明确指定的主键时候mysql锁是怎么使用的,是行级锁 。否则是表级别 。
例子: 假设表foods mysql锁是怎么使用的,存在有id跟name、status三个字段,id是主键,status有索引 。
例1: (明确指定主键,并且有此记录,行级锁)
例2: (明确指定主键/索引,若查无此记录,无锁)
例3: (无主键/索引 , 表级锁)
例4: (主键/索引不明确,表级锁)
for update的注意点
for update的疑问点
mysql中的乐观锁和悲观锁怎么用关于mysql中的乐观锁和悲观锁面试的时候被问到的概率还是比较大的 。
mysql的悲观锁:
其实理解起来非常简单mysql锁是怎么使用的,当数据被外界修改持保守态度,包括自身系统当前的其他事务,以及来自外部系统的事务处理,因此,在整个数据处理过程中,将数据处于锁定状态 。悲观锁的实现,往往依靠数据库提供的锁机制,但是也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在自身系统中实现了加锁机制,也无法保证外部系统不会修改数据 。
来点实际的,当我们使用悲观锁的时候我们首先必须关闭mysql数据库的自动提交属性,因为MySQL默认使用autocommit模式,也就是说,当mysql锁是怎么使用的你执行一个更新操作后,MySQL会立刻将结果进行提交 。
关闭命令为:set autocommit=0;
悲观锁可以使用select…for update实现 , 在执行的时候会锁定数据,虽然会锁定数据,但是不影响其他事务的普通查询使用 。此处说普通查询就是平时我们用的:select * from table 语句 。在我们使用悲观锁的时候事务中的语句例如:
//开始事务
begin;/begin work;/start transaction; (三选一)
//查询信息
select * from order where id=1 for update;
//修改信息
update order set name='names';
//提交事务
commit;/commit work;(二选一)
此处的查询语句for update关键字 , 在事务中只有SELECT ... FOR UPDATE 或LOCK IN SHARE MODE 同一条数据时会等待其它事务结束后才执行,一般的SELECT查询则不受影响 。
执行事务时关键字select…for update会锁定数据 , 防止其他事务更改数据 。但是锁定数据也是有规则的 。
查询条件与锁定范围:
1、具体的主键值为查询条件
比如查询条件为主键ID=1等等,如果此条数据存在,则锁定当前行数据,如果不存在,则不锁定 。
2、不具体的主键值为查询条件
比如查询条件为主键ID1等等,此时会锁定整张数据表 。
3、查询条件中无主键
会锁定整张数据表 。
4、如果查询条件中使用了索引为查询条件
明确指定索引并且查到,则锁定整条数据 。如果找不到指定索引数据,则不加锁 。
悲观锁的确保了数据的安全性,在数据被操作的时候锁定数据不被访问,但是这样会带来很大的性能问题 。因此悲观锁在实际开发中使用是相对比较少的 。
mysql的乐观锁:
相对悲观锁而言,乐观锁假设数据一般情况下不会造成冲突 , 所以在数据进行提交更新的时候,才会对数据的冲突与否进行检测,如果发现冲突,则让返回用户错误的信息 , 让用户决定如何去做 。
一般来说,实现乐观锁的方法是在数据表中增加一个version字段,每当数据更新的时候这个字段执行加1操作 。这样当数据更改的时候 , 另外一个事务访问此条数据进行更改的话就会操作失败 , 从而避免了并发操作错误 。当然,还可以将version字段改为时间戳,不过原理都是一样的 。
例如有表student,字段:
id,name,version
1a1
当事务一进行更新操作:update student set name='ygz' where id = #{id} and version = #{version};
此时操作完后数据会变为id = 1,name = ygz,version = 2,当另外一个事务二同样执行更新操作的时候,却发现version != 1,此时事务二就会操作失败,从而保证了数据的正确性 。
悲观锁和乐观锁都是要根据具体业务来选择使用 , 本文仅作简单介绍 。
MySQL锁表是什么意思?有什么用?什么情况下用?好处?缺点?白话解说如下:
简单说,就是lock table,不让别人动
锁分共享锁和排它锁 。
共享锁时,别人能读,不能改变量表数据
排它锁时,别人既不能读 , 也不能改表数据
根据以上特点 , 应该就知道何时使用锁了 。不想让别人变更数据,对自己产生影响,就加锁 。一定要在不用之后,进行锁释放,不然,应用系统会一直因为读取数据而报错 。
好处就是,保证数据的原子性,完整性,一致性 。只有加锁者释放了锁 , 别人才能改变数据 。
缺点就是 , 增加了系统开销,有可能产生锁等待,造成数据库运行异常 。这都是不正常的使用锁带来的问题 。
mysql 的锁以及间隙锁mysql 为并发事务同时对一条记录进行读写时,提出了两种解决方案:
1)使用 mvcc 的方法,实现多事务的并发读写,但是这种读只是“快照读”,一般读的是历史版本数据,还有一种是“当前读”,一般加锁实现“当前读”,或者 insert、update、delete 也是当前读 。
2)使用加锁的方法,锁分为共享锁(读锁) , 排他锁(写锁)
快照读:就是select
当前读:特殊的读操作,插入/更新/删除操作,属于当前读,处理的都是当前的数据,需要加锁 。
mysql 在 RR 级别怎么处理幻读的呢?一般来说,RR 级别通过 mvcc 机制 , 保证读到低于后面事务的数据 。但是 select for update 不会触发 mvcc , 它是当前读 。如果后面事务插入数据并提交,那么在 RR 级别就会读到插入的数据 。所以,mysql 使用 行锁gap 锁(简称 next-key 锁)来防止当前读的时候插入 。
Gap Lock在InnoDB的唯一作用就是防止其他事务的插入操作,以此防止幻读的发生 。
Innodb自动使用间隙锁的条件:
Mysql中锁的类型有哪些呢?mysql锁分为共享锁和排他锁 , 也叫做读锁和写锁 。
读锁是共享的,可以通过lock in share mode实现,这时候只能读不能写 。
写锁是排他的,它会阻塞其他的写锁和读锁 。从颗粒度来区分 , 可以分为表锁和?锁两种 。
表锁会锁定整张表并且阻塞其他?户对该表的所有读写操作,?如alter修改表结构的时候会锁表 。
?锁?可以分为乐观锁和悲观锁,悲观锁可以通过for update实现,乐观锁则通过版本号实现 。
关于mysql锁是怎么使用的和mysql锁的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读