异步记录日志,主体数据回滚了怎么办

2023-04-04 15:20:21 +08:00
 NoKey

小弟有个问题请教各位大佬:

有个功能,用户在执行操作的时候,会记录日志(写表)

为了让记录日志这步不影响主体数据的执行

我们打算把日志异步记录

那么问题来了,如果执行到一定位置,主体发生异常,回滚了

怎么让异步写的日志跟着回滚呢。。。

或者有没有用的比较广泛的符合这类需求的日志系统呢?

谢谢

2368 次点击
所在节点    程序员
28 条回复
ychost
2023-04-04 21:09:20 +08:00
回滚了再写一条就行了呗,
DinnyXu
2023-04-04 21:23:09 +08:00
感觉很多人没明白 op 说的意思,op 的意思其实就是一个典型的异步事务管控,主体就好比是 A 表,日志就好比是 B 表,而 A 表不在异步事务内,B 表在异步事务内,倘若 A 表出现异常了,这个时候的事务只能回滚 A ,无法回滚 B 。

而 op 需要的就是 A 回滚的时候,也把 B 回滚,以下说几种方法:

1:手动事务提交,主体完成后修改事务为待提交,B 完成后,整体提交事务,这种情况需要注意的是主体的执行时间和日志记录的执行时间不能相差太多,好比主体执行 1s ,日志执行 5s...

2:主体与日志进行某种程度的关联,主体失败后马上记录一条失败的消息到本地表,日志业务执行完成后,检测一下本地表的主体任务是否是完成状态,根据状态进行修正

3:异步消息回滚,类似于 MQ 之类的,这个说起来就比较复杂了,建议还是上面 2 种比较切合实际
ihuotui
2023-04-04 21:26:47 +08:00
参考数据库的实现
546L5LiK6ZOt
2023-04-05 10:25:32 +08:00
两个线程同时操作数据库,又要保证一致性,这相当于是分布式事务了。不过分布式事务的框架比较重,直接搞个定时任务来检查日志是否需要回滚更简单点,做到最终一致。

异步操作是为了不影响主流程,保证可用性,但是可用性和一致性不可兼得。。
Red998
2023-04-05 13:23:01 +08:00
主体成功才异步操作、不成功就不操作
Dganzh
2023-04-05 15:52:26 +08:00
怎么确保这个异步日志写成功的?
NoKey
2023-04-06 10:06:56 +08:00
@zhaogaz 嗯嗯,对的,我没说清楚,操作日志,也算业务数据,用户要查看的,或者出现疑问了,要根据这个操作日志来判断到底是用户自己操作的,还是服务有问题
NoKey
2023-04-06 10:07:53 +08:00
@DinnyXu 感谢,是这个意思

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/929735

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX