今天在工作中,老大指出了表设计的问题。这张表的意图很简单,就是简单地记录内部员工的记录,当然还有一个总用户表,内部员工表中有一个字段“关联”总用户表(是手动维护这个内部员工表的,毕竟这个表中的数据量不大,才几百条记录,当时没有使用外键来关联)。
现在我们要做的事就是每次有一个特定的提前退出操作时,就会对内部员工记录中的一个字段进行更新操作。写的sql也很简单,大致如下:
UPDATE XXX SET XX=XX WHERE COLUMN=XX
现在的问题就是这个COLUMN字段,它没有索引,没有索引的话,当然会走全表扫描了,如果有其它的更新操作的话,这张表肯定会被锁表!
这是一类常见的锁表情况:在没有索引的情况下,多个更新操作会导致锁表情况的发生。
再来看一下InnoDB存储引擎下的锁机制。我们都知道Mysql支持行级锁和表级锁。行级锁的粒度会少很多,而表级锁相对简单很多了,但是它的性能不高。所以我们尽量让其走行级锁,这要可以提升整个系统的性能。
如上面所说,如果没有在where查询字段上建立索引的话,一个查询操作和更新操作并发执行,表的数据量很大,那么它就会被锁表。锁的原理在本质上是很简单的,如果读读并存,没有关联,可以一起执行,如果读写或者写写操作并存,那么这个就不允许一起执行了。
所以在这个版本中,我就按照老大的意思,在where后面查询的字段上建立了一个索引,不让它走全表扫描,避免全表扫描引起的锁表情况。
在Java中,有一个锁并发框架,它其实主要做了三件事情:
1. 计数(读写计数,有多少个线程在进行读写操作);
2. 等待队列(如果当前的资源不允许进行操作,就是加锁了,那么该线程必须要等待了);
3. 线程的阻塞和唤醒(使用底层操作系统的功能了)。
当然在Java中的锁,它提供了一系列的并发数据结构和不同锁机制的类,引入这个就是说明Mysql中锁的实现原理和机制。
分享到:
相关推荐
在 Informix 数据库中,锁表问题是一个常见的错误,会导致系统性能下降和数据不一致。锁表问题的解决需要对数据库进行深入的分析和诊断。本文将讨论 Informix 数据库锁表问题的解决方案,包括锁表的定位和处理。 一...
在Informix数据库管理系统中,锁表处理是一项关键操作,用于解决并发访问时可能出现的死锁问题或因长时间运行的事务导致的阻塞。以下是对标题和描述中...正确处理锁表问题对于保证数据库系统的稳定性和性能至关重要。
2. **表级锁**:作用于整个表,影响范围较广。 3. **模式对象锁**:作用于模式对象(如表、视图等)。 4. **数据块锁**:作用于数据块,比行级锁更粗粒度。 #### 三、查看锁表情况 1. **查询锁定的对象**: ```...
2. **表级锁**:用于锁定整个表,这种类型的锁通常由数据库管理系统自动管理。 3. **共享锁**(S锁):允许多个事务读取一行数据,但阻止其他事务获取该行上的排他锁。 4. **排他锁**(X锁):阻止其他事务获取任何...
3. 锁粒度控制:根据业务场景选择合适的锁粒度,例如从行级锁升级为页级锁或表级锁,或者反之,以平衡并发性和数据一致性。 4. 死锁检测与处理:启用数据库的死锁检测机制,并设置合理的超时参数,避免死锁的发生。 ...
表级锁是最简单的形式,它将整个表视为一个单位进行锁定,分为读锁(共享锁,也称为S锁)和写锁(独占锁,也称为X锁)。读锁允许其他用户读取表,但不允许写入;写锁则阻止任何其他用户读取或写入。 在MySQL中,表...
定期进行数据库维护,如重新组织表、重建索引、分析表统计信息等,可以改善数据分布,减少热点数据区域,从而降低锁升级的发生概率。 **3.4 监控与调优** 持续监控数据库的锁活动,结合业务需求和数据库性能指标,...
locks%'`,我们可以获取关于表级锁定的统计信息,如`table_locks_immediate`表示立即获得表锁的次数,`table_locks_waited`则显示因锁定争用而发生的等待次数,这些指标有助于分析和优化锁的使用。 接着,我们转向...
### Linux锁机制分析 #### 一、加锁的原因与竞态条件 在多线程或并发环境下,多个任务对共享资源或数据进行访问时,如果不加以控制,可能会导致数据的一致性问题,甚至数据错乱。例如,在一个简单的计数器增加操作...
DML锁用于保护数据的完整性,包括TM锁(表级锁)和TX锁(事务锁或行级锁)。TM锁在执行DML语句时自动申请,对整个表进行锁定,分为SS、SX、S、X四种模式。例如,SS模式是行级共享锁,允许其他事务查询该行数据;SX...
在多线程编程中,硬件锁是一种用于解决并发问题的有效机制,特别是在实现多生产者多消费者(Multiple Producer Multiple Consumer, MPMC)链表时。硬件锁通常指的是CPU提供的原子操作,如测试并设置(Test-and-Set)...
InnoDB提供了多种锁类型,如行级锁(记录锁)、表级锁和自增序列锁。锁的等待和死锁检测是通过复杂的算法来实现的,当检测到死锁时,系统会自动选择一个事务进行回滚以打破死锁。此外,半一致读(semi-consistent ...
2. **表级锁**:作用于整个表上。 3. **页级锁**:作用于数据库页上(介于行级和表级之间)。 4. **模式对象锁**:作用于数据库中的其他对象,如索引等。 #### 二、查看数据库锁状态 了解了基本概念之后,我们来看...
table_lock_waited 表示出现表级锁定争用而发生等待的次数(不能立即获取锁的次数),每等待一次锁值加 1,此值高说明存在着较严重的表级锁争用情况。 MyISAM 表锁调度 MyISAM 的表锁调度是写优先,这也是 MyISAM ...
当一个事务中涉及的锁数量达到一定的阈值(锁升级门限)时,系统会自动将行级锁和页面锁升级为表级锁,以减少锁的数量,提高系统性能。这个过程是自动的,用户通常无需手动干预。 锁在SQL Server中有多种模式,每种...
例如,当一个事务对同一表的多条记录进行操作时,如果行级锁的数量达到一定阈值(锁升级门限),SQL Server会将这些行级锁升级为表级锁。 #### 五、SQL Server锁的类型 SQL Server支持多种类型的锁,每种锁都有其...
早期的 Synchronized 锁机制使用重量级锁来实现线程之间的锁竞争,但这种机制存在性能问题,因为它需要操作系统的 Mutex Lock 来实现互斥功能,从而导致用户态到内核态的切换,带来性能损耗。 为解决这个问题,Java...
1. 表级锁:包括表的读锁(SHARE)和写锁(EXCLUSIVE),用于控制对整个表的操作。 2. 行级锁:更细粒度的锁定,如行共享锁(SHARE ROW EXCLUSIVE)和行独占锁(EXCLUSIVE),确保并发访问同一表的不同行时的数据...
例如,在更新单条记录时通常采用行级锁,而在批量更新大量数据时则可能使用表级锁。合理的锁粒度可以避免锁冲突,并且当行级锁的数量超过锁表的最大容量时,系统可以自动转换到更高级别的锁粒度,以保证系统的稳定...
1. 表级锁:Oracle中的表级锁主要有两种,即排他锁(Exclusive Locks, X locks)和共享锁(Shared Locks, S locks)。排他锁允许一个用户修改表中的数据,而共享锁则允许多个用户同时读取表,但不允许任何写操作。 ...