mysql锁

合集下载

MySQL中的表锁和行锁的适用场景和注意事项

MySQL中的表锁和行锁的适用场景和注意事项

MySQL中的表锁和行锁的适用场景和注意事项MySQL是一种常用的开源关系型数据库管理系统,广泛应用于各种类型的应用程序中。

在MySQL中,锁的使用是非常重要的,它能够确保数据的完整性和一致性。

在MySQL中,有两种主要的锁类型,分别是表锁和行锁。

本文将探讨MySQL中的表锁和行锁的适用场景和注意事项。

1. 表锁表锁是MySQL中最基本的锁类型,它可以锁定整个表,阻止其他用户对该表的写操作。

表锁适用于以下场景:1.1 需要对整个表进行操作的场景在某些情况下,我们可能需要对整个表进行操作,例如对表结构进行修改、清空表数据等。

这时,使用表锁可以确保在操作过程中其他用户无法对表进行读写操作,保证操作的完整性。

1.2 需要进行大量数据插入或更新的场景在进行大量数据插入或更新的情况下,如果不使用表锁,可能会导致频繁的行级锁竞争,从而降低性能。

而使用表锁可以减少锁的竞争,提高操作效率。

然而,表锁也存在一些注意事项:1.3 并发性低由于表锁是对整个表进行锁定,所以在使用表锁时并发性较低,即其他用户无法同时对表进行读写操作。

如果在多用户环境下,频繁使用表锁可能会导致性能瓶颈。

1.4 锁粒度较大表锁的锁粒度较大,当一个用户对表进行写操作时,其他用户无法对表进行读写操作。

这样可能会导致其他用户需要等待较长时间,从而影响用户体验。

2. 行锁行锁是MySQL中更细粒度的锁类型,它可以在表的行级别上进行锁定。

行锁适用于以下场景:2.1 需要对表的部分数据进行操作的场景在一些场景下,我们只需要针对表中的部分数据进行操作,而不是整个表。

这时使用行锁可以避免不必要的锁竞争,提高并发性能。

2.2 需要在事务中对多个行进行操作的场景在事务中,我们可能需要对多个行进行操作,如果不使用行锁,可能会导致数据不一致。

使用行锁可以确保在事务中对行的操作是原子性的,从而保证数据的完整性和一致性。

然而,行锁也存在一些注意事项:2.3 锁粒度较小行锁的锁粒度较小,如果在高并发的情况下频繁使用行锁,可能会导致大量的锁竞争,降低性能。

mysql死锁的原因和处理方法

mysql死锁的原因和处理方法

mysql死锁的原因和处理方法MySQL死锁的原因和处理方法。

MySQL作为一种常用的关系型数据库管理系统,在数据处理过程中可能会出现死锁的情况。

死锁是指两个或多个事务在执行过程中,因争夺资源而造成的互相等待的现象,导致它们都无法继续执行下去。

本文将就MySQL死锁的原因和处理方法进行详细介绍。

一、死锁的原因。

1. 事务并发执行。

在MySQL中,多个事务同时对相同的数据进行读写操作时,就有可能发生死锁。

这是因为每个事务在执行过程中会锁定所涉及的数据,当多个事务之间出现循环等待的情况时,就会导致死锁的发生。

2. 锁的粒度过大。

如果在事务中对数据进行操作时,锁的粒度过大,即锁定了过多的数据,就会增加死锁的概率。

因为锁的粒度过大会导致不同的事务之间争夺同一把锁,从而增加了死锁的可能性。

3. 事务持有锁的时间过长。

当事务持有锁的时间过长时,就会增加其他事务发生死锁的可能。

因为其他事务需要等待较长的时间才能获取到所需的锁,从而增加了死锁的风险。

二、死锁的处理方法。

1. 设置合理的事务隔离级别。

在MySQL中,可以通过设置合理的事务隔离级别来减少死锁的发生。

通过设置较低的隔禅级别,可以减少事务对数据的锁定,从而降低死锁的概率。

2. 优化数据库索引。

通过优化数据库索引,可以减少事务对数据的锁定时间,从而降低死锁的风险。

合理的索引设计可以减少数据的扫描次数,提高数据的访问效率,从而减少死锁的可能性。

3. 控制事务的大小和时长。

在编写程序时,应尽量控制事务的大小和持有锁的时间,避免长时间的锁定操作。

可以将大的事务拆分成多个小的事务,并尽量减少事务的持有时间,从而降低死锁的概率。

4. 监控和处理死锁。

在MySQL中,可以通过设置死锁检测和处理机制来监控和处理死锁。

当发生死锁时,可以通过自动或手动的方式来解除死锁,从而保证数据库的正常运行。

结语。

通过以上介绍,我们可以看到MySQL死锁的原因和处理方法。

在实际应用中,我们应该充分理解死锁的原因,采取合理的措施来预防和处理死锁,从而保证数据库系统的稳定和可靠运行。

mysql表死锁的解决方法

mysql表死锁的解决方法

mysql表死锁的解决方法MySQL的死锁是指两个或多个事务在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,这些事务都将无法向前推进。

以下是解决MySQL死锁的一些常用方法:1. 重新尝试操作:对于很多简单的死锁情况,最简单的解决办法就是中断其中一个事务并重新开始。

如果应用程序设计得当,可以使用重试逻辑来自动解决这类死锁。

2. 使用低隔离级别:死锁通常在可序列化的隔离级别中出现,降低隔离级别可以减少死锁的机会。

但这同时也增加了其他的问题,如幻读和不可重复读。

3. 设置锁超时时间:通过设置`innodb_lock_wait_timeout`(InnoDB存储引擎)或`lock_wait_timeout`(MyISAM存储引擎)来定义事务等待锁的最长时间。

如果超过这个时间,事务就会自动失败并返回一个死锁错误。

4. 优化查询:确保SQL查询是优化过的,避免长时间持有锁或造成锁争用的情况。

例如,尽量避免在事务中执行大量的更新操作。

5. 避免在事务中使用用户输入:如果用户输入可能导致死锁,应尽量避免在事务中使用用户输入。

6. 使用适当的索引:确保查询使用到了正确的索引,这样可以减少锁定的行数,从而减少死锁的机会。

7. 分析并解决死锁:使用`SHOW ENGINE INNODB STATUS`命令来分析当前的InnoDB状态,找出导致死锁的原因。

根据分析结果,可能需要重新设计查询、更改事务的顺序或更改数据库的结构来解决死锁问题。

8. 考虑应用程序逻辑:有时候,应用程序的逻辑可能会导致死锁。

例如,如果两个事务都需要更新表中的同一行,那么它们就会死锁。

在这种情况下,可能需要重新设计应用程序的逻辑来避免这种情况。

9. 监控和告警:使用工具如Percona Monitoring and Management (PMM)、Zabbix等来监控数据库的健康状况,并在检测到死锁时发送告警。

10. 升级MySQL版本:随着MySQL版本的迭代,一些死锁问题可能已经被修复。

MySQL中的行级锁与表级锁区别与应用

MySQL中的行级锁与表级锁区别与应用

MySQL中的行级锁与表级锁区别与应用MySQL是一种广泛应用的关系型数据库管理系统,它在设计之初就考虑到了并发访问的需求。

为了保证数据的一致性和完整性,MySQL引入了锁的概念。

在MySQL中,锁的种类包括行级锁和表级锁。

本文将详细讨论MySQL中行级锁和表级锁的区别、应用场景以及如何选择合适的锁级别。

一、行级锁的概念和特点行级锁是MySQL中最细粒度的锁,它锁定一行数据,其他事务需要访问该行数据时需要等待锁释放。

行级锁的特点如下:1. 并发性高:由于锁的粒度最小,不同事务可以并发地访问不同的行数据,提高了并发性和系统的吞吐量。

2. 锁冲突少:由于锁的粒度小,当多个事务并发地访问不同行数据时,锁的冲突机会较低,减少了事务之间的阻塞时间。

3. 锁开销大:由于锁的粒度小,锁的数量增多,会增加锁的管理和维护的开销。

4. 锁粒度小:行级锁可以很细粒度地控制事务的并发访问,对于只修改少量数据的事务来说,锁的粒度可以更小,减少了锁的冲突。

二、表级锁的概念和特点表级锁是MySQL中最粗粒度的锁,它锁定整个表,其他事务需要访问该表时需要等待锁释放。

表级锁的特点如下:1. 并发性低:由于锁的粒度最大,同一时刻只能有一个事务访问整个表,降低了并发性和系统的吞吐量。

2. 锁冲突多:由于锁的粒度大,当多个事务并发地访问同一个表时,锁的冲突机会较高,事务之间的阻塞时间较长。

3. 锁开销小:由于锁的粒度大,锁的数量减少,减少了锁的管理和维护的开销。

4. 锁粒度大:表级锁只能控制整个表的并发访问,对于需要修改大量数据的事务来说,锁的粒度较大,容易造成事务等待的时间过长。

三、行级锁和表级锁的应用场景行级锁和表级锁在应用中有不同的场景和使用方式。

1. 行级锁的应用场景:a) 当并发事务多且并发性要求较高时,采用行级锁可以提高并发度,减少事务之间的阻塞时间。

b) 当事务需要对少量数据进行修改时,行级锁的粒度更小,可以减少锁的冲突和阻塞时间。

MySQL中的锁(表锁、行锁)

MySQL中的锁(表锁、行锁)

MySQL中的锁(表锁、⾏锁)锁是计算机协调多个进程或纯线程并发访问某⼀资源的机制。

在数据库中,除传统的计算资源(CPU、RAM、I/O)的争⽤以外,数据也是⼀种供许多⽤户共享的资源。

如何保证数据并发访问的⼀致性、有效性是所在有数据库必须解决的⼀个问题,锁冲突也是影响数据库并发访问性能的⼀个重要因素。

从这个⾓度来说,锁对数据库⽽⾔显得尤其重要,也更加复杂。

概述相对其他数据库⽽⾔,MySQL的锁机制⽐较简单,其最显著的特点是不同的存储引擎⽀持不同的锁机制。

MySQL⼤致可归纳为以下3种锁:表级锁:开销⼩,加锁快;不会出现死锁;锁定粒度⼤,发⽣锁冲突的概率最⾼,并发度最低。

⾏级锁:开销⼤,加锁慢;会出现死锁;锁定粒度最⼩,发⽣锁冲突的概率最低,并发度也最⾼。

页⾯锁:开销和加锁时间界于表锁和⾏锁之间;会出现死锁;锁定粒度界于表锁和⾏锁之间,并发度⼀般----------------------------------------------------------------------MySQL表级锁的锁模式(MyISAM)MySQL表级锁有两种模式:表共享锁(Table Read Lock)和表独占写锁(Table Write Lock)。

对MyISAM的读操作,不会阻塞其他⽤户对同⼀表请求,但会阻塞对同⼀表的写请求;对MyISAM的写操作,则会阻塞其他⽤户对同⼀表的读和写操作;MyISAM表的读操作和写操作之间,以及写操作之间是串⾏的。

当⼀个线程获得对⼀个表的写锁后,只有持有锁线程可以对表进⾏更新操作。

其他线程的读、写操作都会等待,直到锁被释放为⽌。

MySQL表级锁的锁模式MySQL的表锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。

锁模式的兼容如下表MySQL中的表锁兼容性当前锁模式/是否读锁写锁兼容/请求锁模式读锁是否写锁否否可见,对MyISAM表的读操作,不会阻塞其他⽤户对同⼀表的读请求,但会阻塞对同⼀表的写请求;对MyISAM表的写操作,则会阻塞其他⽤户对同⼀表的读和写请求;MyISAM表的读和写操作之间,以及写和写操作之间是串⾏的!(当⼀线程获得对⼀个表的写锁后,只有持有锁的线程可以对表进⾏更新操作。

mysql数据库死锁的产生原因及解决办法

mysql数据库死锁的产生原因及解决办法

mysql数据库死锁的产⽣原因及解决办法这篇⽂章主要介绍了mysql数据库锁的产⽣原因及解决办法,需要的朋友可以参考下数据库和操作系统⼀样,是⼀个多⽤户使⽤的共享资源。

当多个⽤户并发地存取数据时,在数据库中就会产⽣多个事务同时存取同⼀数据的情况。

若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的⼀致性。

加锁是实现数据库并发控制的⼀个⾮常重要的技术。

在实际应⽤中经常会遇到的与锁相关的异常情况,当两个事务需要⼀组有冲突的锁,⽽不能将事务继续下去的话,就会出现死锁,严重影响应⽤的正常执⾏。

在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。

当数据对象被加上排它锁时,其他的事务不能对它读取和修改。

加了共享锁的数据对象可以被其他事务读取,但不能修改。

数据库利⽤这两种基本的锁类型来对数据库的事务进⾏并发控制。

死锁的第⼀种情况⼀个⽤户A 访问表A(锁住了表A),然后⼜访问表B;另⼀个⽤户B 访问表B(锁住了表B),然后企图访问表A;这时⽤户A由于⽤户B已经锁住表B,它必须等待⽤户B释放表B才能继续,同样⽤户B要等⽤户A释放表A才能继续,这就死锁就产⽣了。

解决⽅法:这种死锁⽐较常见,是由于程序的BUG产⽣的,除了调整的程序的逻辑没有其它的办法。

仔细分析程序的逻辑,对于数据库的多表操作时,尽量按照相同的顺序进⾏处理,尽量避免同时锁定两个资源,如操作A和B两张表时,总是按先A后B的顺序处理,必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源。

死锁的第⼆种情况⽤户A查询⼀条纪录,然后修改该条纪录;这时⽤户B修改该条纪录,这时⽤户A的事务⾥锁的性质由查询的共享锁企图上升到独占锁,⽽⽤户B⾥的独占锁由于A 有共享锁存在所以必须等A释放掉共享锁,⽽A由于B的独占锁⽽⽆法上升的独占锁也就不可能释放共享锁,于是出现了死锁。

这种死锁⽐较隐蔽,但在稍⼤点的项⽬中经常发⽣。

MySQL中的表锁和行锁的区别与应用

MySQL中的表锁和行锁的区别与应用

MySQL中的表锁和行锁的区别与应用MySQL是一种广泛使用的关系型数据库管理系统,它具有高性能、高可靠性和易于使用等优点。

在使用MySQL时,我们可能会遇到表锁和行锁两种不同的锁机制。

本文将探讨MySQL中的表锁和行锁的区别与应用,以帮助读者更好地理解和使用这两种锁。

一、概念解析1. 表锁表锁是MySQL中最基本的锁机制,它是对整个表进行加锁。

当一个事务获取了表锁后,其他事务就无法对该表进行任何修改操作,直到锁被释放。

表锁是一种粗粒度锁,它对数据并发访问的并发性能影响比较大。

2. 行锁行锁是MySQL中的一种细粒度锁,它是对表中的行进行加锁。

当一个事务获取了某一行的行锁后,其他事务可以继续对该表的其他行进行操作,只有对同一行有冲突的事务才会被阻塞。

行锁相较于表锁,能够提高并发性能。

二、表锁和行锁的区别1. 锁的粒度表锁是对整张表进行加锁,锁的粒度比较大;而行锁是对表中的行进行加锁,锁的粒度比较小。

2. 并发性能由于锁的粒度不同,导致了表锁的并发性能较差。

当一个事务获取了表锁后,其他事务无法对该表进行任何修改操作,这就导致了并发度的下降。

而行锁只对被操作行进行加锁,不会影响其他行的操作,因此并发性能较好。

3. 锁的开销由于锁的粒度不同,表锁的开销一般比行锁的开销要小。

因为行锁需要记录更多的锁信息,而表锁只需要记录一个锁即可。

4. 冲突范围表锁对整张表起作用,会阻塞整个表的修改操作;而行锁对某一行起作用,只有对同一行有冲突的事务才会被阻塞。

三、表锁和行锁的应用场景1. 表锁的应用场景表锁适用于以下情况:- 需要对整个表进行操作,并发度较低的情况下,使用表锁可以简化锁的管理,降低系统开销。

- 频繁地进行读写操作,且写操作较少的情况下,使用表锁可以避免锁冲突带来的性能问题。

2. 行锁的应用场景行锁适用于以下情况:- 频繁地进行读写操作,且写操作较多的情况下,使用行锁可以提高并发性能,减少锁冲突带来的性能问题。

mysql 行锁的原理

mysql 行锁的原理

mysql 行锁的原理MySQL是一款广泛使用的关系型数据库管理系统,它支持多种锁机制来保护数据并发访问。

其中,行锁是MySQL中一种常见的锁类型,用于控制对数据库表中行的访问。

本篇文章将介绍MySQL行锁的原理,包括其实现方式、适用场景以及注意事项。

一、行锁的实现方式MySQL的行锁是通过索引实现的。

当一个事务需要修改一行数据时,MySQL会先检查该行是否已经被其他事务锁定。

如果没有被锁定,则对该行进行锁定,并执行相应的更新操作。

如果该行已经被锁定,则事务需要等待,直到锁定释放。

MySQL使用索引来锁定行,这是因为索引能够提高数据库的查询性能。

通过索引,MySQL能够快速定位到需要修改的行,从而减少了对整个表进行锁定的开销。

在锁定行时,MySQL会根据索引键来获取相应的行数据页(RowDataPage,简称RDP)。

一旦获取到RDP,就可以对其进行锁定和修改操作。

二、行锁的适用场景行锁适用于高并发、数据量较大的场景,能够提高数据库的并发性能和响应速度。

以下是一些适用行锁的场景:1.更新操作:当事务需要修改一行数据时,使用行锁能够保证数据的一致性和完整性。

2.插入操作:当事务需要插入一行数据时,可以使用行锁来防止其他事务对同一行数据进行修改。

3.删除操作:当事务需要删除一行数据时,可以使用行锁来确保数据的一致性。

三、行锁的注意事项在使用行锁时,需要注意以下几点:1.锁定的粒度:合理的锁粒度可以提高并发性能和降低死锁的可能性。

过细的锁粒度会增加系统开销,而过粗的锁粒度则可能导致数据不一致性。

2.锁定的范围:锁定范围越小,系统受到的影响就越小,但同时也可能降低并发性能。

因此,需要根据具体场景来选择合适的锁定范围。

3.死锁处理:死锁是并发编程中常见的问题之一。

在使用行锁时,需要采取适当的措施来避免死锁的发生,例如设置超时时间、使用锁顺序等。

4.锁定的释放:在事务结束或失败时,需要及时释放所持有的锁,以避免长时间占用资源或导致死锁。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• l 当concurrent_insert设置为1时,如果MyISAM表中没有空洞(即表的中 间没有被删除的行),MyISAM允许在一个进程读表的同时,另一个进程从 表尾插入记录。这也是MySQL的默认设置。
• l 当concurrent_insert设置为2时,无论MyISAM表中有没有空洞,都允许 在表尾并发插入记录。
• 所以对MyISAM表的读操作,不会阻塞其他用户对同一表的读请 求,但会阻塞对同一表的写请求;对 MyISAM表的写操作,则会 阻塞其他用户对同一表的读和写操作;MyISAM表的读操作与写 操作之间,以及写操作之间是串行的!根据如表20-2所示的例子 可以知道,当一个线程获得对一个表的写锁后,只有持有锁的线 程可以对表进行更新操作。其他线程的读、写操作都会等待,直 到锁被释放为止。
MyISAM的锁调度
• MyISAM存储引擎的读锁和写锁是互斥的,读写操作是串行的。 那么,一个进程请求某个 MyISAM表的读锁,同时另一个进程也 请求同一表的写锁,MySQL如何处理呢?
• 答案是写进程先获得锁。不仅如此,即使读请求先到锁等待队列, 写请求后到,写锁也会插到读锁请求之前!这是因为MySQL认为 写请求一般比读请求要重要。这也正是MyISAM表不太适合于有 大量更新操作和查询操作应用的原因,因为,大量的更新操作会 造成查询操作很难获得读锁,从而可能永远阻塞。这种情况有时 可能会变得非常糟糕!幸好我们可以通过一些设置来调节 MyISAM 的调度行为。
下面可查看例子
InnoDB行锁实现方式
• InnoDB行锁是通过给索引上的索引项加锁来实现的 • 这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据
行加锁来实现的。InnoDB这种行锁实现特点意味着:只有通过索 引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表 锁!
• 可以使用:lock table table_name read/write;
并发插入(Concurrent Inserts)
• MyISAM存储引擎有一个系统变量concurrent_insert,专门用以控 制其并发插入的行为,值分别可以为0、1或2。
• 可修改my.conf: • l 当concurrent_insert设置为0时,不允许并发插入。
锁定粒度界于表锁和行锁之间,并发度一般。
• 从锁的角度来说:表级锁更适合于以查询为主,只有少量按索引 条件更新数据的应用,如Web应用;
• 而行级锁则更适合于有大量按索引条件并发更新少量不同数据, 同时又有并发查询的应用,如一些在线事务处理(OLTP)系统。
• 重点介绍MySQL表锁和 InnoDB行锁的问题, • 注:BDB已经被InnoDB取代,即将成为历史
InnoDB的行பைடு நூலகம்模式及加锁方法
• l数共据享集锁的(排S他)锁:。允许一个事务去读一行,阻止其他事务获得相同 • l 排他锁(X):允许获得排他锁的事务更新数据,阻止其他事务
取得相同数据集的共享读锁和排他写锁。 • 另外,为了允许行锁和表锁共存,实现多粒度锁机制,InnoDB还
有两种内部使用的意向锁(Intention Locks),这两种意向锁都是 表锁。 • l个意数向据共行享加锁共(享IS锁)前:必事须务先打取算得给该数表据的行IS加锁行。共享锁,事务在给一 • l一意个向数排据他行锁加(排IX他)锁:前事必务须打先算取给得数该据表行的加IX行锁排。他锁,事务在给
下面讲另外一个Innodb
• 1.事务(Transaction)及其ACID属性
• 事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为事务的ACID属性。 • l 原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。 • l 一致性(Consistent):在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规
分析表锁争锁的情况:
• 可以通过检查:show status like 'table%'; table_locks_waited表示需要等待的表锁数 和table_locks_immediate表示立即释放表锁数 状态变量来分析系统上的表锁定争夺: 如果Table_locks_waited的值比较高,则说明存在着较严重的表级锁 争用情况。
• 如果一个事务请求的锁模式与当前的锁兼容,InnoDB就将请求的 锁授予该事务;反之,如果两者不兼容,该事务就要等待锁释放。
• 意向锁是InnoDB自动加的,不需用户干预。对于UPDATE、DELETE 和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X);对于 普通SELECT语句,InnoDB不会加任何锁;
• SELECT查询的HIGH_PRIORITY(高优先级)关键字也类似。它允许SELECT插 入正在等待的写入操作之前,即使在正常情况下写入操作的优先级更高。另 外一种影响是,高优先级的SELECT在正常的SELECT语句之前执行,因为这些 语句会被写入操作阻塞。
• LOW_PRIORITY选项的语句都默认地按照低优先级来处理,那么请使用--lowpriority-updates选项来启动服务器。通过使用INSERT HIGH_PRIORITY来把 INSERT语句提高到正常的写入优先级,可以消除该选项对单个INSERT语句的 影响。
MySQL 锁
注本:
• MySQL锁的特点是不同的存储引擎支持不同的锁机制。比如, MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);
• BDB存储引擎采用的是页面锁(page-level locking),但也支持表 级锁;
• InnoDB存储引擎既支持行级锁(row-level locking),也支持表级 锁,但默认情况下是采用行级锁。
如何加表锁
• MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加 读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自 动给涉及的表加写锁,这个过程并不需要用户干预,因此,用户 一般不需要直接用LOCK TABLE命令给MyISAM表显式加锁
• 给MyISAM表显示加锁,一般是为了在一定程度模拟事务操作, 实现对某一时间点多个表的一致性读取。
Tpis:
如果Table_locks_immediate / Table_locks_waited >一定的值(书上未介绍),最好采用InnoDB引擎, 因为InnoDB是行锁而MyISAM是表锁,对于高并发写入的应用InnoDB效果会好些。
表级锁的锁模式
• MySQL的表级锁有两种模式:表共享读锁(Table Read Lock)读锁 和表独占写锁(Table Write Lock)
• 通过指定启动参数low-priority-updates,使MyISAM引擎默认给予 读请求以优先的权利。
• 通过执行命令SET LOW_PRIORITY_UPDATES=1,使该连接发出的更 新请求优先级降低。
• 通过指定INSERT、UPDATE、DELETE语句的LOW_PRIORITY属性,降 低该语句的优先级。
则都必须应用于事务的修改,以保持数据的完整性;事务结束时,所有的内部数据结构(如B树索引或双向 链表)也都必须是正确的。 • l 隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立” 环境执行。这意味着事务处理过程中的中间状态对外部是不可见的,反之亦然。 • l 持久性(Durable):事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。 • 银行转帐就是事务的一个典型例子。
• LOW_PRIORITY关键字影响DELETE、INSERT、LOAD DATA、REPLACE和UPDATE语 句的执行调度。通常情况下,某张数据表正在被读取的时候,如果有写入操 作到达,那么写入者一直等待读取者完成操作(查询开始之后就不能中断, 因此允许读取者完成操作)。如果写入者正在等待的时候,另一个读取操作 到达了,该读取操作也会被阻塞(block),因为默认的调度策略是写入者 优先于读取者。当第一个读取者完成操作的时候,写入者开始操作,并且直 到该写入者完成操作,第二个读取者才开始操作。
锁的特性大致归纳:
• 开销、加锁速度、死锁、粒度、并发性能 • 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发
生锁冲突的概率最高,并发度最低。 • 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发
生锁冲突的概率最低,并发度也最高。 • 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;
• 如果写入操作是一个LOW_PRIORITY(低优先级)请求,那么系统就不会认为 它的优先级高于读取操作。在这种情况下,如果写入者在等待的时候,第二 个读取者到达了,那么就允许第二个读取者插到写入者之前。只有在没有其 它的读取者的时候,才允许写入者开始操作。理论上,这种调度修改暗示着, 可能存在LOW_PRIORITY写入操作永远被阻塞的情况。如果前面的读取操作在 进行的过程中一直有其它的读取操作到达,那么新的请求都会插入到 LOW_PRIORITY写入操作之前。
相关文档
最新文档