1. MySQL的行锁是什么?
MySQL中的行锁是一种允许多个用户访问同一数据库表的不同行的并发控制机制。这种机制主要用于处理并发操作,并确保数据库的一致性和完整性。
在MySQL中,支持行锁的存储引擎主要有InnoDB和Falcon。它们实现了两种类型的行锁,即共享锁(S)和排他锁(X):
- 共享锁(S) :也被称为读锁,设置共享锁的事务可以读取行,但不能对其进行修改。其他事务也可以读取行,但不能对其进行修改。
- 排他锁(X) :也被称为写锁,设置排他锁的事务可以读取和修改行。其他事务不能读取或者修改这行。
MySQL中的行锁主要由以下两种模式:
- 记录锁(Record Locks) :这是最基本的行锁类型。它锁定的是满足某个查询条件的索引记录。
- 间隙锁(Gap Locks) :这是一种范围锁,锁定的是一个范围,而不是具体的某一行的记录。间隙锁的主要目的是防止记录的"幻读"。
在实际使用中,选择哪种锁定策略主要取决于要执行的具体操作以及性能要求。无论哪种锁定策略,设计的主要目的都是为了在保证数据一致性的同时,允许尽可能多的并发读写操作。
2. MySQL的事务的隔离?
在数据库管理系统中,事务是一个或多个更改数据库的单元。为了确保并发事务的正确性并防止问题(如丢失更新、脏读、不可重复读和幻读),数据库系统提供了一种叫做事务隔离的机制。
MySQL支持以下四种事务隔离级别:
- READ UNCOMMITTED(未提交读) :这是最低的隔离级别。在这个级别,一个事务可以看到其他未提交事务的更改,这被称为“脏读”。这个级别很少用,因为它可能导致很多并发问题。
- READ COMMITTED(提交读) :这是大多数数据库系统的默认隔离级别。在这个级别,一个事务只能看到其他事务已经提交的更改。这解决了脏读的问题,但仍然可能发生不可重复读的问题,这是因为一个事务在读取同一行两次之间,另一个事务可能会更改该行。
- REPEATABLE READ(可重复读) :在这个级别,一个事务在其整个过程中都能保持一致的视图,即事务读取的每一行在事务内都不会改变,即使其他事务对其进行了修改。这可以解决不可重复读的问题,但仍然可能发生幻读的问题。这是MySQL的默认隔离级别。
- SERIALIZABLE(串行化) :这是最高的隔离级别。在这个级别,事务被处理为完全串行化的方式。也就是说,如果一个事务已经持有一个数据项的锁,那么其他事务就不能访问该数据项,直到第一个事务完成。这解决了所有并发问题,包括幻读,但可能导致性能下降。
事务隔离级别的选择需要在并发性能和数据一致性之间进行权衡。增加隔离级别可以解决更多的并发问题,但可能导致数据库性能下降。另一方面,降低隔离级别可以提高并发性能,但可能导致数据不一致性。
3. MySQL的普通索引和唯一索引?
在MySQL中,索引用于提高数据查询的效率。普通索引和唯一索引是MySQL中两种常见的索引类型。
- 普通索引(Normal Index) :也被称为非唯一索引,这是最基本的索引类型。它没有任何限制,可以在一个表中的任意多个列上创建普通索引。普通索引允许索引列包含重复的值。
- 唯一索引(Unique Index) :唯一索引不允许任何重复的值。如果一个列或列组合上有唯一索引,任何尝试输入重复的值都将导致错误。唯一索引既可以保证数据的唯一性,也可以提高查询效率。
这两种索引类型都可以大大提高查询速度,但也会稍微降低插入和更新操作的速度,因为在插入和更新数据时,MySQL需要同时更新索引。另外,它们也会占用一些存储空间。
选择使用哪种索引类型主要取决于你的数据和查询需求。如果你需要保证数据的唯一性,那么应该使用唯一索引。否则,如果只是需要加速查询,可以使用普通索引。