liuyangming / ByteTCC

ByteTCC is a distributed transaction manager based on the TCC(Try/Confirm/Cancel) mechanism. It’s compatible with the JTA specification. User guide: https://github.com/liuyangming/ByteTCC/wiki
https://www.bytesoft.org/
GNU Lesser General Public License v3.0
2.9k stars 911 forks source link

请教一下cleanupFile的用途 #137

Closed ghost closed 3 years ago

ghost commented 3 years ago

看源码,在forget方法里面会写入cleanup文件 那这个cleanup文件后续有什么用途吗?

liuyangming commented 3 years ago

看源码,在forget方法里面会写入cleanup文件 那这个cleanup文件后续有什么用途吗?

ByteTCC为了保证在宕机/断电这种情况下准确判断每个本地事务的真是状态,设置了一张bytejta表,该表中的记录随着每个每个本地事务一起提交/回滚,因此后续恢复时只需要判断该表中是否存在指定xid的记录,即可知道宕机前对应本地事务是否提交/回滚。------ 这是前提!

随着全局事务的最终完成,bytejta表中相关的记录就成了无效数据,需要清除,否则会影响后续本地事务的insert效率。一种简单的方案是,全局事务commit/rollback成功后将归属的每个本地事务对应在bytejta中的记录即刻删除,但这样会影响事务性能,毕竟清除操作不属于业务操作且需要消耗时间。

因此,byteTCC采用了异步清理的方式:在全局事务commit/rollback完成时,将归属本地事务的xid记录在待清理文件(CleanFile)中,快速完成该全局事务,后续由定时任务定期清理这些xid。这样,就可以不必占用业务线程的时间;此外,异步处理还可以按资源(db实例)来做批量处理:可以按数据库一次性清理多个全局事务的记录,提升处理效率。

ghost commented 3 years ago

好的,感谢