MySQL的锁机制是为了确保数据库事务的ACID属性(原子性、一致性、隔离性、持久性)以及并发控制和数据完整性而设计的。MySQL的锁可以从多个角度进行分类,以下是对MySQL中各种锁类型的详细归纳:
一、按模式分类
- 乐观锁:并不是真正的数据库锁,而是一种锁的应用策略。它通常基于数据版本(如时间戳或版本号)来实现,认为冲突发生的概率较低,在事务结束时检查冲突。
UPDATE table_name SET version = version + 1, column1 = value1 WHERE id = some_id AND version = read_version;
- 悲观锁:依赖数据库的锁机制来保证操作的原子性,通常在事务开始时就获取锁,防止其他事务干扰。行锁、表锁等都是悲观锁的应用。
二、按粒度分类
- 全局锁:对整个数据库实例加锁,加锁后整个实例处于只读状态,后续的DML(数据操纵语言)、DDL(数据定义语言)语句以及更新操作的事务提交语句都将被阻塞。常用于全库的逻辑备份或导出。
#!/bin/bash # MySQL 连接信息 MYSQL_USER="your_mysql_user" MYSQL_PASSWORD="your_mysql_password" MYSQL_HOST="your_mysql_host" MYSQL_PORT="your_mysql_port" # 通常是3306 MYSQL_DATABASE="your_database" # 获取全局读锁 echo "Locking tables for read..." mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -h$MYSQL_HOST -P$MYSQL_PORT -D$MYSQL_DATABASE -e "FLUSH TABLES WITH READ LOCK;" # 在这里执行你的操作,例如备份 echo "Starting backup..." # 示例:使用mysqldump进行备份 mysqldump -u$MYSQL_USER -p$MYSQL_PASSWORD -h$MYSQL_HOST -P$MYSQL_PORT $MYSQL_DATABASE > /path/to/backup.sql # 检查备份是否成功 if [ $? -eq 0 ]; then echo "Backup completed successful