1. Mysql中Innodb的锁

MySQL 中的 InnoDB 存储引擎默认是开启了行级锁的,这种锁机制称为“MVCC(Multi-Version Concurrency Control)”,即多版本并发控制。

InnoDB 存储引擎的每行数据都包含一个隐藏的列,用来存储每行数据的创建、删除版本号,以及该数据行最近一次被修改的版本号。当进行并发访问时,InnoDB 会根据数据行的版本号来判断该数据行是否可被读取或修改,从而实现行级锁,避免数据冲突和并发问题。

如果需要关闭 InnoDB 的行级锁,可以在 MySQL 配置文件中将参数 innodb_table_locks 设置为 0,但这种方式不建议实际使用,因为它会导致性能下降和数据不一致等问题。

2. 行级锁中的乐观锁

在行级锁的机制下,InnoDB 存储引擎会使用隐藏列来实现乐观锁的功能。乐观锁机制是一种无锁并发控制技术,它不需要显式地使用锁来保护数据,而是基于数据版本号来进行协调多个并发事务之间的访问。每个事务在读取数据时,都会获取该数据行的版本号,当事务提交时,会比较该版本号是否与当前数据行的版本号一致,如果不一致,则会放弃事务并重新尝试,直到提交成功为止。

在 InnoDB 的实现中,使用隐藏列来存储数据行的版本号,可以使 InnoDB 存储引擎在进行并发控制时,无需加锁,提高了并发处理的效率。同时,由于不需要加锁,也将避免由于锁定导致的死锁和长时间的等待等问题。

需要注意的是,InnoDB 存储引擎的乐观锁机制并不是强制的,对于一些特殊或复杂的场景可能并不适用,因此在设计和实现时需要根据实际情况进行权衡和取舍。