3.MySQL中的锁
mysql中的锁分全局锁、表锁、行锁。
1.全局锁
当执行命令 flush tables with read lock (FTWRL) 即可对整库加锁,全局锁的用途是做整库备份。
当数据库所用引擎支持事务时可用一致性视图来解决这个问题。即用可重复读隔离级别,当导数据之前开启一个事物即可做到数据的一致性。MySQL自带的逻辑备份命令是mysqldump, 当使
用 mysqldump --single-transaction 时即在导入数据前开启一个事物,来确保拿到一致性视图。
注:(1) set global readonly = true也可以锁住整库,但是风险很大,当客户端断开连接时锁不会释放。
(2) single-transaction 方法只适用于所有的表使用事务引擎的库。
2.表级锁
(1)表锁
语法:lock tables 表名 read/write 即对表加读锁或写锁,用unlock tables 表名即可主动释放锁。
(2)元数据锁(MDL)
元数据锁不需要显示加上,在访问一个表时会被自动加上。对一个表做增删改查时加MDL读锁,对一个表的结构做更改时加MDL写锁,读锁之间不互斥,读锁和写锁、写锁和写锁之间互斥。
如何安全的给一个小表加一个字段?
分析:首先要解决长事务,因为长事务会占用MDL锁(可在information_schema中的innodb_trx表中查看),若有长事务可考虑暂停DDL,或者kill这个长事务。
如果是个热点表(有频繁请求的表),则可用NOWAIT / WAIT N语法:alter table 表名 NOWAIT add column ; alter table 表名 WAIT N add column;
3.行锁
待续。。。
原文地址:https://www.cnblogs.com/quxiangxiangtiange/p/11041978.html
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解