MySQL长事务处理办法
长事务(Long-Lived Transactions),顾名思义,就是执行时间较长的事务。在innodb中可以查询到当前执行中的事务。
select * from information_schema.INNODB_TRX;
在访问表时,innodb会自动给加上元数据锁(meta data lock,MDL),MDL是表级锁。如果是读,就是共享锁,写就是排它锁。当执行长事务时,后续的事务如果要获取排它锁就会被阻塞。可能引发系统崩溃严重事故。
解决办法:
1.等系统不繁忙时操作
2.检查表information_schema.INNODB_TRX是否有长事务,考虑先暂停DDL,或者kill掉这个长事务。
3.将长事务分解成小批量事务。
4.设置等待获取锁时间,超时时放弃更新。
ALTER TABLE tbl_name WAIT N add column ...
拓展:
全局锁
全局锁就对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的MDL的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。其典型的使用场景是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。加全局锁的两种方法:
一. FLUSH TABLES WRITE READ LOCK (FTWRL,推荐使用)
二. set global readonly=true
当你需要让整个库处于只读状态的时候,可以使用FTWRL这种方式。之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。
全局锁的典型使用场景是,做全库逻辑备份。也就是把整库每个表都select出来存成文本。
注意,在备份过程中整个库完全处于只读状态。
在Innodb引擎中可以使用官方自带的逻辑备份工具是mysqldump。当mysqldump使用参数–single-transaction的时候,导数据之前就会启动一个事务,来确保拿到一致性视图。而由于MVCC的支持,这个过程中数据是可以正常更新的。
本文地址:https://blog.csdn.net/u012483153/article/details/107308715
上一篇: 浅谈数据库事务隔离
推荐阅读
-
使用distinct在mysql中查询多条不重复记录值的解决办法
-
新装MySql后登录出现root帐号提示mysql ERROR 1045 (28000): Access denied for use的解决办法
-
Mysql5.7.14安装配置方法操作图文教程(密码问题解决办法)
-
java实现插入mysql二进制文件,blob类型,遇到问题及解决办法
-
Linux 初始化MySQL 数据库报错解决办法
-
Mysql5.7.14 linux版密码忘记完美解决办法
-
Windows下MySQL服务无法停止和删除的解决办法
-
MySQL保存中文字段时报错的解决办法
-
crentso7.4下rpm方式安装MySQL5.7.22出现安装冲突conflicts的解决办法
-
使用cmd运行mysql数据库的时候,报错:"不是内部命令也不是可有运行的程序"问题的解决办法