我们的 Teamcenter(西门子的软件)经常运行数小时甚至数天的交易。就好像他们被遗忘了一样。甚至有 20 多个交易运行时间超过一个小时,甚至 20 小时。它们极大地填充了临时数据库,并且通常不会自行终止(必须被杀死)。我们的 Teamcenter 集成商说没关系,因为有些“翻译”过程需要很长时间。但是让事务运行这么长时间是否正确?
谢谢
我们的 Teamcenter(西门子的软件)经常运行数小时甚至数天的交易。就好像他们被遗忘了一样。甚至有 20 多个交易运行时间超过一个小时,甚至 20 小时。它们极大地填充了临时数据库,并且通常不会自行终止(必须被杀死)。我们的 Teamcenter 集成商说没关系,因为有些“翻译”过程需要很长时间。但是让事务运行这么长时间是否正确?
谢谢
虽然 Dan 是正确的,但您的问题的措辞方式可能会导致它被主观地回答(不幸的是,这使得它不太适合这个网站),我认为以下是足够客观的答案:
通常最好的做法是在完成任务工作流所需的尽可能短的时间内保持事务处于打开状态。当涉及并发时,事务的发生时间越短(显然越不频繁)通常会导致整体系统性能更好。
具有并发性(例如,多个用户)的系统,其中事务长时间保持打开状态,存在对正在处理的对象增加阻塞的风险,因为事务将锁定对该对象的访问。
对于长时间运行的事务,更糟糕的是,它们是否由于错误或进程被终止而回滚(就像你提到的那样,你已经在做)。回滚总是(大部分)是单线程的,这可能导致回滚发生的时间比事务处理到目前为止所花费的时间要长得多(在整个回滚过程中仍然保持事务中的对象锁定)。
需要一个小时才能运行的交易不是我个人喜欢的(但并非闻所未闻)。我尽量保持自己的交易尽可能快(最多几秒钟)。持续数天的交易绝对不正常/司空见惯。但是,如果您使用的系统不支持并发并且一次只允许一个用户,那么至少它只会影响您(当前用户)谁正在等待如此缓慢的进程完成。
在我看来,听起来您的 Teamcenter 软件编写效率低下。
运行这么长时间的事务表明存在严重错误,通常与事务本身(编码)有关,但有时与底层表结构、索引和我们 DBA 玩的所有其他“有趣”的东西有关。
不,这不是“好的”。
当一个事务被杀死时,它会被回滚,使数据库处于事务从未发生过的状态,所以无论他们认为正在发生什么工作,都不是!
对于任何需要这么长时间的过程,这表明它可能正在进行大量更新,这暗示数据结构规范化程度不高,或者可能是使用复杂的“文档”数据类型,如 JSON,需要大量的处理能力重写它们,每次更新它们的任何部分。
将应用程序团队送回绘图板,让他们想出一个更好的方法来做到这一点。