• 请不要在回答技术问题时复制粘贴 AI 生成的内容
NoKey
V2EX  ›  程序员

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

  •  
  •   NoKey · Apr 4, 2023 · 3818 views
    This topic created in 1309 days ago, the information mentioned may be changed or developed.

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

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

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

    我们打算把日志异步记录

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

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

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

    谢谢

    28 replies  •  2023-04-06 10:07:53 +08:00
    LeegoYih
    LeegoYih
    Apr 4, 2023
    1
    冲正,再写一条反日志
    optional
    optional
    Apr 4, 2023 via iPhone
    2
    transaction ?
    opengps
    opengps
    Apr 4, 2023❤️3
    3
    日志作为历史发生信息的记录,不应该跟着回滚吧,你说的日志是不是具体业务数据了?
    dqzcwxb
    dqzcwxb
    Apr 4, 2023
    4
    @LeegoYih #1 如果反日志也异常了咋办 手动狗头
    liuxu
    liuxu
    Apr 4, 2023
    5
    日志就是日志,回滚会打一条回滚的日志
    NoKey
    NoKey
    OP
    Apr 4, 2023
    6
    @LeegoYih 比如日志记录了一个用户的操作,执行任务,暂停任务,取消任务,那么日志会有三条,如果主体那边回滚了,日志这边咋记录?跟 sql 回滚一样,一条对一条?难度有点大哟🤣
    NoKey
    NoKey
    OP
    Apr 4, 2023
    7
    @opengps 可以不跟着回滚,那需要表达哪些日志是无效的(主体回滚了)
    jones2000
    jones2000
    Apr 4, 2023
    8
    建 id 关联, 关联不上的 id 就是废日志。
    abelyao
    abelyao
    Apr 4, 2023
    9
    不回滚,记录一条 XX 执行失败的日志(不是给用户看的那种日志)
    Oilybear
    Oilybear
    Apr 4, 2023
    10
    我也同意上面 opengps 老哥的说法,应该记录一条日志说上面若干无效。然后再有独立的 job 加锁冲正解锁,不然就不算日志系统了
    adoal
    adoal
    Apr 4, 2023
    11
    @NoKey “一条对一条?难度有点大哟” 同一事务的每条操作日志里都额外记录事务 id
    Nooooobycat
    Nooooobycat
    Apr 4, 2023
    12
    write ahead log? 写入的话就直接对文件末尾顺序写入,删除 /回滚也是写入,写入一个墓碑日志标记前一个日志失效
    leeqingshui
    leeqingshui
    Apr 4, 2023
    13
    异步写的日志为啥需要回滚?
    这个需求好奇怪呀,不想在日志表里看出错的日志?
    一般不是需要看日志中的标识字段查询请求的处理结果是否成功嘛?

    正常来说:代码出错了应该会报异常,对异常做回滚处理,而在日志表一般直接是用相关标识字段来标识(比如 Is_success_flag )请求是否处理成功,比如 Is_success_flag 为 1 ,那么请求是成功的,Is_success_flag 是 0 ,那么请求是失败的(失败也可以把出错信息记录到另一字段存储)。

    为啥需要回滚呢???
    imkuang
    imkuang
    Apr 4, 2023 via Android
    14
    主体异常这一情况不应该也记录到日志中吗?为什么反过来是日志要回滚。
    你如果要从日志追溯这一次主体的异常怎么办呢?
    huajia2005
    huajia2005
    Apr 4, 2023
    15
    日志不是给用户看的,主题回滚了,肯定有一条是错误日志,真要找也是有办法的.日志回滚没必要
    Wh1te
    Wh1te
    Apr 4, 2023
    16
    事务提交成功后再触发日志异步记录
    tedzhou1221
    tedzhou1221
    Apr 4, 2023
    17
    不是业务逻辑通过后才异步记录日志吗?有点好奇啊
    cryboy007
    cryboy007
    Apr 4, 2023
    18
    不应该通过事务提交事件去做嘛
    zhaogaz
    zhaogaz
    Apr 4, 2023
    19
    我猜一下, 我觉得可能是没定义清楚业务概念。

    你说的这个记录日志,应该是一种业务数据, 不是正常意义上的一种程序输出的日志。所以你这个记录日志应该是某一个业务需求的一部分。

    感觉上你这个可能是某些审计需求。

    如果是我的话,根据你的描述,可能会套一个事务里面,完成之后,再发异步消息。大概这个思路。
    securityCoding
    securityCoding
    Apr 4, 2023
    20
    日志为啥要回滚,记录异常日志不就好了吗
    ychost
    ychost
    Apr 4, 2023
    21
    回滚了再写一条就行了呗,
    DinnyXu
    DinnyXu
    Apr 4, 2023
    22
    感觉很多人没明白 op 说的意思,op 的意思其实就是一个典型的异步事务管控,主体就好比是 A 表,日志就好比是 B 表,而 A 表不在异步事务内,B 表在异步事务内,倘若 A 表出现异常了,这个时候的事务只能回滚 A ,无法回滚 B 。

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

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

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

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

    异步操作是为了不影响主流程,保证可用性,但是可用性和一致性不可兼得。。
    Red998
    Red998
    Apr 5, 2023
    25
    主体成功才异步操作、不成功就不操作
    Dganzh
    Dganzh
    Apr 5, 2023
    26
    怎么确保这个异步日志写成功的?
    NoKey
    NoKey
    OP
    Apr 6, 2023
    27
    @zhaogaz 嗯嗯,对的,我没说清楚,操作日志,也算业务数据,用户要查看的,或者出现疑问了,要根据这个操作日志来判断到底是用户自己操作的,还是服务有问题
    NoKey
    NoKey
    OP
    Apr 6, 2023
    28
    @DinnyXu 感谢,是这个意思
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1504 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 62ms · UTC 23:19 · PVG 07:19 · LAX 15:19 · JFK 18:19
    ♥ Do have faith in what you're doing.