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的支持,这个过程中数据是可以正常更新的。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞翔的咩咩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值