开发者社区> 问答> 正文

canal中的transaction ID获取和entry.getHeader().getLogfi

问题1:

canal的一个message可能会对应mysql中的多个transaction,通过方法message.getEntries()可以获得List entrys,entry又 分为transanctionBegin/ transactionEnd以及rowdata。 现在问题是,我在 > 获取transaction id< 的时候只有通过transactionEnd.getTransactionId拿到的是正常的数字,但是通过transactionbegin和rowdata获取到的则都是null。

请问canal中还有其他方法获取到transaction id吗?

问题2:

entry.getHeader().getLogfileOffset()获取的偏移量是当前(entry)rowdata在日志文件中的序号(即第几条日志)还是字节数(即该row前面的数据所占的字节数)?

求大神赐教!

谢谢

原提问者GitHub用户alexlgj

展开
收起
绿子直子 2023-05-09 08:07:29 65 0
2 条回答
写回答
取消 提交回答
  • 自己动手通过mysqlbinlog --hexdump可以查看到commit才有xid。 offset是字节偏移。

    原回答者GitHub用户lcybo

    2023-05-09 19:37:36
    赞同 展开评论 打赏
  • 问题1:

    在 Canal 中,transactionBegin 和 rowData 都不包含 transactionId,只有 transactionEnd 包含 transactionId。因此,如果您需要获取 transactionId,建议您只从 transactionEnd 中获取。

    如果您需要确定某个 row 是否属于当前 transaction,可以将 row 的 binlog 序号(binlog file offset)与 transactionBegin 和 transactionEnd 中的序号进行比较,如果 row 的序号在这两个序号之间,那么这个 row 属于当前 transaction。

    问题2:

    entry.getHeader().getLogfileOffset() 获取到的是当前 rowdata 在 binlog 文件中的序号(即第几条 binlog 日志),而非字节数。具体来说,该值表示当前 rowdata 在 binlog 文件中的偏移量(offset),可以唯一地标识当前 rowdata 在 binlog 文件中的位置。

    2023-05-09 09:01:37
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载