前序
原文链接1:https://cloud.tencent.com/developer/article/1899373
MySQL有9种存储引擎,不同的引擎,适合不同的场景,常用引擎为InnoDB,它是MySQL的默认存储引擎。
登录MySQL,执行show engines可以查询MySQL支持的存储引擎,如图示:
1、InnoDB引擎
(1)它事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键。缺点以损失效率来保证数据的一致性。
(2)存储表和索引有两种形式:
A:使用共享表空间存储:所有的表和索引存放在同一个表空间中。
B:使用多表空间存储:表结构放在frm文件,数据和索引放在IBD文件中。分区表的每个分区对应单独的IBD文件,使用分区表的好处在于提升查询效率。
2、MyISAM引擎
没有事务,拥有较高的插入、查询速度,每个MyISAM在磁盘上存储成三个文件
(1)frm文件:存储表的定义数据
(2)MYD文件:存放表具体记录的数据。
(3)MYI文件:存储索引
3、MEMORY
MEMORY存储引擎将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问。每一个表实际上和一个磁盘文件关联,文件是frm。支持的数据类型有限制(不支持TEXT和BLOB类型)
(1)支持的锁粒度为表级锁。所以在访问量比较大时,表级锁会成为MEMORY存储引擎的瓶颈。
(2)由于数据是存放在内存中,一旦服务器出现故障,数据都会丢失
(3)MEMORY存储引擎支持HASH和BTREE索引。
问题及描述
问题一:
两个程序同时读取mysql5.7表中某一行记录,一条做编辑操作,一条做修改操作,mysql5.7是否默认自带有加锁机制?如果有,那默认的锁机制是什么?
MySQL 5.7 默认使用行级锁机制,即在对行数据进行修改、删除等操作时,只会锁定该行数据,而不是整张表,因此可以支持更高的并发性和可扩展性。
在上述情况下,当两个程序同时读取 MySQL 5.7 表中某一行记录并进行编辑和修改操作时,MySQL 5.7 会自动加锁,保证并发操作的正确性和一致性。具体来说,MySQL 5.7 会根据事务的隔离级别和操作类型,自动加上相应的锁,以保证数据的一致性和完整性。
在默认情况下,MySQL 5.7 采用的是可重复读(REPEATABLE READ)隔离级别,即在事务开始时,会将当前的数据快照存储在事务中,事务中的所有操作都是基于这个快照进行的,所以可以避免脏读、不可重复读和幻读等问题。对于修改操作,MySQL 5.7 会自动加上排他锁(X锁),防止其他事务修改该行数据,对于编辑操作,MySQL 5.7 会自动加上共享锁(S锁),防止其他事务同时进行编辑操作。当事务提交或回滚后,MySQL 5.7 会自动释放相应的锁,以保证数据的一致性和完整性。
问题二:
当两个程序同时读取Mysql5.7表中某一行记录并进行编辑和修改操作,这个编辑和修改不是同一个操作么?
对于MySQL 5.7中的行级锁机制来说,编辑和修改操作不是同一个操作。具体来说,编辑操作和修改操作都会对该行数据进行操作,但是它们的操作类型不同,因此 MySQL 5.7 会根据操作类型自动加上相应的锁。
编辑操作一般是指对该行数据进行读取,但不会对数据进行修改,因此 MySQL 5.7 会自动加上共享锁(S锁),以防止其他事务修改该行数据。而修改操作则是指对该行数据进行更新、删除等操作,因此 MySQL 5.7 会自动加上排他锁(X锁),以防止其他事务同时进行修改操作。因此,在两个程序同时读取 MySQL 5.7 表中某一行记录并进行编辑和修改操作时,它们的操作类型不同,MySQL 5.7 会自动加上相应的锁,以保证数据的一致性和完整性。