请问一下看到别人的代码,在有事务的情况下在 finally 记录操作(记录是指业务数据的变更历史) 是不是多此一举啊,还是有其它考虑?

2020-07-24 14:08:29 +08:00
 dengji85
//事务的情况下
public void update() {
	try{
    //数据库操作
    }catch(e){
    
    }finall{
    	//数据库存储数据变更记录
    }

}
1565 次点击
所在节点    程序员
11 条回复
Varobjs
2020-07-24 14:35:07 +08:00
瞎写,finally 应该只做关闭连接、清除资源等工作
npe
2020-07-24 14:42:28 +08:00
transaction 失败了怎么办
zsdroid
2020-07-24 14:47:49 +08:00
业务就是要操作记录啊。
dengji85
2020-07-24 15:38:23 +08:00
@npe 这是业务的变更历史,不是操作记录,事务失败业务数据没有变更,自然没有变更记录
hun2008hun
2020-07-24 15:51:50 +08:00
catch 怎么操作的,不 throw 的话事务没效果呀
zarte
2020-07-24 16:25:54 +08:00
操作记录而已,某某人做了啥,一般来说都是成功的。用来追究责任。
dengji85
2020-07-24 17:50:14 +08:00
@hun2008hun 有抛 runtimeexception
xizismile
2020-07-24 18:02:27 +08:00
一般重要数据都要有变更记录的,记录了谁什么时间点操作了数据,便于审计和追责

这种一般用 aop 来实现更好一些
dengji85
2020-07-25 09:05:38 +08:00
@xizismile 我是想不通已有事务控制了,数据更改成功操作记录一定会保存下来,如果抛异常事务回滚,也没必要 finally 去处理
xizismile
2020-07-25 10:28:17 +08:00
@dengji85 数据库中的数据,你只能看到一个稳定的状态。现在需要的是看到这条数据连续变化的状态,知道是谁改了这条数据,便于追责。和这条数据用不用事务没有半毛钱关系,这个你能明白吗
abersheeran
2020-07-25 16:37:11 +08:00
我觉得有点蠢。记录代码应该放 try 里啊。try 里有事务,一旦报错直接回滚,就没必要记录了。

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

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

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

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

© 2021 V2EX