mysql中的锁的相关知识

数据库锁:数据库锁出现的原因是为了处理并发问题。

并发控制一般采用三种方法,分别是乐观锁和悲观锁以及时间戳。

乐观锁认为一个用户读数据的时候,别人不会去写自己所读的数据,就是不做任何操作。悲观锁就刚好相反,觉得自己读数据库的时候,别人可能刚好在写自己刚读的数据,其实就是持一种比较保守的态度,悲观锁就是在读取数据的时候,为了不让别人修改自己读取的数据,就会先对自己读取的数据加锁,只有自己把数据读完了,才允许别人修改那部分数据,或者反过来说,就是自己修改某条数据的时候,不允许别人读取该数据,只有等自己的整个事务提交了,才释放自己加上的锁,才允许其他用户访问那部分数据。悲观锁所说的加“锁”。

悲观锁分为:

读锁/共享锁:共享的锁,多个客户端可以同时读取一个资源,互补干扰。
写锁/排它锁:一个锁会阻塞其他的写锁和读锁,确保一个时刻只有一个客户端对通过一个数据进行修改写入。

时间戳就是在数据库表中单独加一列时间戳,比如“TimeStamp”,每次读出来的时候,把该字段也读出来,当写回去的时候,把该字段加1,提交之前 ,跟数据库的该字段比较一次,如果比数据库的值大的话,就允许保存,否则不允许保存。

表锁 是开销比较小的策略,会锁定整张表。MyISAM和InnoDB都支持表级锁定。用户对表进行写操作,需要先获得锁,并且会阻塞用户对该表的所有读操作。 数据库中对表进行修改,如alter table会使用到表锁,会锁定整张表,因此此类操作在数据库中应该谨慎使用。

行锁 行锁可以高效的支持并发,当然锁开销也是最大。MySQL的InnoDB引擎中实现了行锁,在用户写数据时,只锁定需要操作的数据行,相比于表锁并发度更好。

InnoDB支持事务,

事务是数据库区别于文件系统的额重要特性之一。事务符合ACID特性。原子性:原子性是指数据库事务是不可分割的工作单位。只有数据库事务中的所有数据库操作执行都成功,才算整个事务成功。如果事务中的任何一个SQL语句执行失败,已经执行的SQL语句也必须撤销,数据库状态退回到执行事务前的状态。

一致性:事务执行之前和之后,数据库的完整性约束没有被破坏。

隔离性:一个事物的影响在它提交前对其他事务不可见(通过锁来实现)

持久性:事务一旦提交,其结果就是永久性的。

原子性,一致性,持久性通过redo,undo来完成。

并发事务所带来的问题:

  • 更新丢失(Lost Update):当两个事务T1和T2读入同一数据做修改并发执行时,T2把T1或T1把T2的修改结果覆盖掉,造成数据的丢失更新问题,导致数据的不一致。
  • 脏读(Dirty Reads):事务T1更新了数据R,事务T2读取了更新后的数据R,事务T1由于某种原因被撤销,恢复数据R。这样T2读取的数据和数据库中内容不一样。
  • 不可重复读(Non-Repeatable Reads):一个事务对同一行数据读取了两次,结果不同。
  • (1)事务T1读取了数据R,事务T2读取并更新了R,当事务再读取R进行核对时,两次读取的值不一样。
  • (2)事务操作过程中进行了两次查询,第二次查询的结果包含了第一次查询中未出现的数据或缺少了第一次查询的数据,这种情况称为幻读。

间隙锁(Next-Key锁)

当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”,InnoDB也会对这个“间隙”加锁,这种锁机制不是所谓的间隙锁(Next-Key锁)。

举例来说,假如emp表中只有101条记录,其empid的值分别是1,2,...,100,101,下面的SQL:

SELECT * FROM emp WHERE empid > 100 FOR UPDATE

是一个范围条件的检索,InnoDB不仅会对符合条件的empid值为101的记录加锁,也会对empid大于101(这些记录并不存在)的“间隙”加锁。

InnoDB使用间隙锁的目的,一方面是为了防止幻读,以满足相关隔离级别的要求,对于上面的例子,要是不使用间隙锁,如果其他事务插入了empid大于100的任何记录,那么本事务如果再次执行上述语句,就会发生幻读;另一方面,是为了满足其恢复和复制的需要。有关其恢复和复制对机制的影响,以及不同隔离级别下InnoDB使用间隙锁的情况。

很显然,在使用范围条件检索并锁定记录时,InnoDB这种加锁机制会阻塞符合条件范围内键值的并发插入,这往往会造成严重的锁等待。因此,在实际开发中,尤其是并发插入比较多的应用,我们要尽量优化业务逻辑,尽量使用相等条件来访问更新数据,避免使用范围条件。

死锁

两个用户分别锁定一个资源,之后双方又都等待双方释放所锁定的资源,就产生一个锁定请求环,从而出现死锁。死锁往往出现在行级锁中。

如何解决死锁?

在InnoDB的事务管理和锁定机制中,有专门用于检测死锁的机制。当检测当死锁时,InnoDB会选择产生死锁的两个事务中的较小的一个完成回滚。

原文地址:https://www.cnblogs.com/smallJunJun/p/9573959.html

时间: 2024-11-11 14:39:36

mysql中的锁的相关知识的相关文章

Mysql中那些锁机制之MyISAM

说到锁机制之前,先来看看Mysql的存储引擎,毕竟不同的引擎的锁机制也随着不同. 三类常见引擎: MyIsam :不支持事务,不支持外键,所以访问速度快.锁机制是表锁,支持全文索引 InnoDB :支持事务.支持外键,所以对比MyISAM,InnoDB的处理效率差一些,并要占更多的磁盘空间保留数据和索引.锁机制是行锁,不支持全文索引 Memory:数据是存放在内存中的,默认哈希索引,非常适合存储临时数据,服务器关闭后,数据会丢失掉. 如何选择存储引擎: MyISAM:应用是以读操作和插入操作为主

MySQL中的锁

数据库中有很多锁,但锁是为了解决什么问题?具体都有哪些锁呢?这篇文章简单对MySQL中的锁做了一个总结 一.锁的设计是为了解决什么问题? 当多用户读写数据的时候,就有可能会出现同一时刻对同一条数据的读写,如果是大家都只是对同一条数据进行读,无所谓,大家读到数据都是一样的,但当有的想要读取数据,有的想要修改数据的时候,或者大家都想要修改数据的时候就会出现问题.比如有一行数据现在值是5,同一时刻有两个用户都想要修改这行数据,用户1和用户2此刻读到的数据都是5,用户1在数据5的基础上加了1变成6,并将

MySQL中的锁(表锁、行锁)

锁是计算机协调多个进程或纯线程并发访问某一资源的机制.在数据库中,除传统的计算资源(CPU.RAM.I/O)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所在有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素.从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂. 概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制. MySQL大致可归纳为以下3种锁: 表级锁:开销小,加锁快:不会出

MySQL中的锁(表锁、行锁,共享锁,排它锁,间隙锁)

本文参考: http://mysqlpub.com/thread-5383-1-1.html http://blog.csdn.net/c466254931/article/details/53463596 有很多是转载合并过来. 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的 计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数据库必须解决的一 个问题,锁冲突也是影响数据库并发访问性能的一个重

关于MYSQL中的锁

根据mysql存储引擎的不同,支持的锁也不同. myisam,memory,支持表级锁. innodb,支持行级锁和表级锁,默认为行级锁. 表级锁,把整个表锁住.锁表快.不存在死锁.冲突多. 行级锁,锁指定的行.锁表慢.可能出现死锁.冲突少. 关于死锁: 表中有2条数据X,Y.有两个人都想修改这两个数据.并且A先修改X,然后修改Y.B先修改Y,然后修改X. 这两个人同时执行这个事情. 表级锁:无论A先执行还是B先执行,都会先把表锁了,另一个人只能等待,知道第一个人操作完成.所以数据是肯定安全的.

Mysql中的锁机制

原文:http://blog.csdn.net/soonfly/article/details/70238902 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的 计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数据库必须解决的一 个问题,锁冲突也是影响数据库并发访问性能的一个重要因素.从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂.本章我们着重讨论MySQL锁机制 的特点,常见的锁问题

Mysql中那些锁机制之InnoDB

我们知道mysql在曾经.存储引擎默认是MyISAM.可是随着对事务和并发的要求越来越高,便引入了InnoDB引擎.它具有支持事务安全等一系列特性. InnoDB锁模式 InnoDB实现了两种类型的行锁. 共享锁(S):同意一个事务去读一行,阻止其它事务获得同样的数据集的排他锁. 排他锁(X):同意获得排他锁的事务更新数据,可是组织其它事务获得同样数据集的共享锁和排他锁. 能够这么理解: 共享锁就是我读的时候,你能够读,可是不能写.排他锁就是我写的时候.你不能读也不能写.事实上就是MyISAM的

mysql中的锁机制之概念篇

锁的概念 ①.锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具. ②.在计算机中,是协调多个进程或线程并发访问某一资源的一种机制. ③.在数据库当中,除了传统的计算资源(CPU.RAM.I/O等等)的争用之外,数据也是一种供许多用户共享访问的资源. ④.如何保证数据并发访问的一致性.有效性,是所有数据库必须解决的一个问题. ⑤.锁的冲突也是影响数据库并发访问性能的一个重要因素. MySQL锁的概述 相对于其它数据库而言,MySQL的锁机制比较简单,其最 显著的特点是不同的存储引擎支持不同的

5.MySQL中的锁

什么是锁?MySQL 中提供了几类锁? 锁是实现数据库并发控制的重要手段,可以保证数据库在多人同时操作时能够正常运行.MySQL 提供了全局锁.行级锁.表级锁.其中 InnoDB 支持表级锁和行级锁,MyISAM 只支持表级锁. 详解锁 全局锁: 对整个数据库实例加锁,MySQL提供了一个加全局读锁的命令:[Flush tables with read lock]-FTWRL.当需要让整个库处于只读状态,可使用这个命令.其他线程进行:增删改.数据定义(建表.修改表)和更新类事务的提交语句都会被阻