再聊canal的FlatMessage和事务之间的关系

背景

近期得益于项目上的技改推动,我对canal又有了进一步的认识。

最开始我以为flatMassage的id代表的是binlog的唯一id,随着对canal的使用深度不断加深,我逐渐认识到原先认为的是错误的。

你是否有过这样的疑问:

  • 事务与FlatMessage的id是什么关系?
  • 不同事务的FlatMessage的id肯定不一样吗?

数据库事务是指一系列数据库操作或查询,它们被看作一个不可分割的工作单元。在这个过程中,要么所有的操作都成功执行,要么在发生错误时,所有的操作都要回滚到事务开始前的状态。数据库事务可以确保数据的一致性和有效性,因为它们允许多个用户同时访问同一数据库,并且保证任何时候都不会出现数据被部分修改或删除的情况。同时,事务还拥有原子性、一致性、隔离性、持久性这四个特性,被称为ACID(原子性、一致性、隔离性、持久性)属性。

关于FlatMessage的id

[danger] 做个比喻,大家可能会更好理解。如果把FlatMessage比作日记本里的日记,那么id代表的是写满日记的纸张的页码。

以下是我总结的一些结论。详细过程涉及到敏感数据,过程就不演示了,大家可以验证以下我的结论。当然,最好的方式还是看源码,能够来得更直接。

  1. FlatMessage是canal发送给消息中间件时的一个数据结构。
public class FlatMessage implements Serializable {
    private static final long serialVersionUID = -3386650678735860050L;
    private long id;
    private String database;
    private String table;
    private List<String> pkNames;
    private Boolean isDdl;
    private String type;
    private Long es;
    private Long ts;
    private String sql;
    private Map<String, Integer> sqlType;
    private Map<String, String> mysqlType;
    private List<Map<String, String>> data;
    private List<Map<String, String>> old;
}
  1. FlatMessage是对同一个表、同类操作(UPDATEINSERTDELETE)的数据集合。
  2. FlatMessage关联的数据大小有上限的,即FlatMessage不会把同一个事务中的数据都放到同一条消息中。
  3. id相同的数据,不一定来自于同一个事务;正如一张纸写的不一定是同一天的日记。

你可能感兴趣的:(#,Canal,mysql,canal)