罗耀斌 发表于 2024-11-20 16:09:17

【10.0.102】数据库事务的问题

方法A增加事务,调用方法B也有事务,B插入数据库时抛异常500返回,A只是调用没有接收和处理异常,但B抛异常的数据也提交保存了





不知道算不算BUG。

Levi.Zhang 发表于 2024-11-20 16:53:48

大佬,从控制台信息中可以看到两个事务都被成功捕获了:



没看到数据提交保存成功了,大佬这边可以提供下相关问题Demo吗?这边复现一下;
其实大佬在外层B方法可以写try、catch捕获异常呀,感觉外层重复加事务命令可能不是最佳选择~~~

罗耀斌 发表于 2024-11-20 17:14:01

Levi.Zhang 发表于 2024-11-20 16:53
大佬,从控制台信息中可以看到两个事务都被成功捕获了:




B方法里的事务回滚了,有提示发生错误回滚事务,A方法的事务没处理,但数据库里的数据保存进去了,这样写确实不是很合理的,但最好也预防一下这种情况,因为我们公司开发这样写了,导致现在好多数据保存不全了 ;P。我搞个DEMO过来

Levi.Zhang 发表于 2024-11-20 17:43:40

好的大佬~
:i0tw2:

罗耀斌 发表于 2024-11-20 17:54:51

Levi.Zhang 发表于 2024-11-20 17:43
好的大佬~


直接执行B方法,是不会保存到数据库的,



执行测试服务就保存成功了

罗耀斌 发表于 2024-11-20 18:00:21

罗耀斌 发表于 2024-11-20 17:54
直接执行B方法,是不会保存到数据库的,




这个的话注意点就不会有问题,但咱工具面向的对象技术能力参差不齐,现在这个问题就是我们公司以前做实施现在转开发活字格的同事弄出来我测试的时候发现的,如果可以杜绝的话,会给以后其他格友少好多处理数据的机会 ;P,后面肯定还会有其他格友和我现在同事一样非正规技术转过来的

Levi.Zhang 发表于 2024-11-21 10:03:51

{:5_108:}

Levi.Zhang 发表于 2024-11-21 18:04:02

问题跟进:

问题复现:在方法A调用方法B时,如果写了调用B方法的返回码和返回值,那么外置A方法的事务没回滚,导致错误数据保存到数据库里:





大佬,这边调查了一下,发现问题出在了调用服务端方法中的返回码和返回信息上:

活字格的策略为:当用户把 返回码 保存至 填写了变量名称之后,表示调用的服务端命令的结果 保存至变量中,后续逻辑由用户控制,意味着外层的这个事务是没有收到报错的,因为用户自已要根据返回码进行判断,决定后续怎么处理业务逻辑。


比如加入条件判断,让code的值,如果不等于0,就调用返回命令;返回码是非0(100,非0表示出错,0表示成功)
当加了这个条件判断之后,会发现事务就都回滚了,不会到数据库中进行保存



当另外一个 调用无返回的服务端命令中, 返回码 保存至 没填写,为空,这种情况下,表示用户没有处理B方法的返回,那最外层的事务命令就会根据B方法返回码进行处理。B方法返回码为-1(非0表示出错),那自然事务就进行了回滚,数据自然也不会保存到数据库里


罗耀斌 发表于 2024-11-22 09:38:30

Levi.Zhang 发表于 2024-11-21 18:04
问题跟进:

问题复现:在方法A调用方法B时,如果写了调用B方法的返回码和返回值,那么外置A方法的事务没 ...

好的

Nathan.guo 发表于 2024-11-22 15:01:00

:mj72:
页: [1]
查看完整版本: 【10.0.102】数据库事务的问题