flink结果入mysql_Flink结果集写Mysql的异常分析

本文分析了在Flink实时计算中,数据写入MySQL时可能出现的死锁异常,详细解释了死锁产生的原因和示例,并对比了RDS/TDDL与OTS数据库引擎的锁机制。提出了使用OTS作为结果表以避免死锁,以及在必须使用MySQL时的一些建议,如避免高并发写入、谨慎使用UniqueKey和进行分库分表等。
摘要由CSDN通过智能技术生成

报错信息:Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction

在实时计算 Flink中,下游数据库使用Mysql等关系数据库(对应的connector为TDDL和RDS),当实时计算频繁写某个表或者资源时,存在死锁风险。

死锁形成的示例

假设完成一次insert需要依次抢占(A, B) 2个锁。A是一个范围锁,有2个事务(T1,T2),表的schema为(id(自增主键), nid(唯一键))。T1包含2条insert(null, 2),(null, 1), T2包含1条insert(null, 2)。

t时刻, T1第一条insert插入,此时T1持有(A, B)2个锁。

t+1时刻T2开始插入,需要等待锁A来锁住(-inf, 2], 此时A被T1拥有,且锁住了(-inf, 2],区间存在包含关系,所以T2依赖T1释放A。

t+2时刻T1第二条insert执行,需要A锁住(-inf, 1], 该区间属于(-inf, 2],所以需要排队等T2释放锁,所以T1依赖T2释放A。

当T1和T2相互依赖且相互等待时死锁形成。

RDS/TDDL、OTS数据库引擎锁的区别

RDS、TDDL:——InnoDB的行锁是针对索引加的锁,不是针对单条记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的索引键,是会出现锁冲突的,造成了一整个区域的数据都无法更新。

OTS:——单行锁&

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值