我们正在制作一些记录问题,我们需要在DB中编写logentries。但是进程在事务中运行并且通过回滚来删除新的logentries。我可以在交易中写入DB吗?像NO-UNDO选项那样用temptable写的东西......?新的logentries仍然留在DB ......?
答案 0 :(得分:1)
另一种可能性是使用app服务器。应用服务器会话上的事务独立于原始会话中的事务(这是可选和冗余的“DISTINCT TRANSACTION”语法的全部内容)。
答案 1 :(得分:1)
另一种选择是使用简单的消息传递系统。一个非常容易设置和使用的选项是STOMP。它是平台中立的,很容易上手。
Julian Lyndon-Smith在一个月前在PEG上发布了以下内容,它的设置和使用与他说的一样容易(我已经尝试过了,我使用的ApacheMQ也非常容易设置和使用) :
继波士顿和芬兰的演讲之后,dot.r就是 很高兴地宣布开源Stomp项目,可用 立即
从http://www.dotr.com或。下载 https://bitbucket.org/jmls/stomp,dot.r stomp程序允许你 将进度会话连接到任何其他应用程序或服务 它连接到同一个消息代理。
支持Stomp的开源免费消息代理是:
<强>保险丝强>
(http://fusesource.com/products/fuse-mq-enterprise/)[一家由Red Hat inc拥有的Progress公司] Fuse MQ Enterprise是一种基于标准的开源消息传递平台,可以在非常小的空间内部署。缺乏执照 费用与高性能,可靠的消息传递相结合 用于任何开发环境提供了一个解决方案 支持无处不在的集成
<强>的ActiveMQ 强>
Apache ActiveMQ(tm)(http://activemq.apache.org/)是最受欢迎的 和强大的开源消息传递和Integration Patterns服务器。阿帕奇 ActiveMQ很快,支持许多跨语言客户端和协议 具有易于使用的企业集成模式和许多高级功能 同时完全支持JMS 1.1和J2EE 1.4。
Apache ActiveMQ是在Apache 2.0许可下发布的。
<强>的RabbitMQ 强>
RabbitMQ是一个消息代理。主要想法很简单:它 接受和转发消息。你可以把它想象成一个帖子 办公室:当你发邮件到邮箱时,你很确定先生。 邮递员最终将邮件发送给您的收件人。用这个 隐喻RabbitMQ是邮箱,邮局和邮递员。
RabbitMQ和邮局之间的主要区别在于事实 它不涉及纸张,而是接受,存储和 转发二进制blob数据 - 消息。
请随时记录任何问题 https://bitbucket.org/jmls/stomp发布系统,并将项目分叉 为了提交您要添加的所有新功能 ......
dot.r Stomp使用许可的MIT许可证 (http://en.wikipedia.org/wiki/MIT_License)
玩得开心,享受!
儒略
答案 2 :(得分:0)
对数据库的每次更改都必须是事务的一部分。如果您没有显式启动它,它将为您隐式启动,并使用事务功能限定到下一个外部块。
然而,虽然我不建议您使用子事务。您可以通过在事务范围内显式指定DO TRANSACTION来调用子事务。虽然数据库永远不会知道它,但客户端可以回滚子事务,而数据库可以提交事务。
但是为了实现这样的东西,你必须掌握事务范围,块行为和错误处理的概念。
RealHeavyDude。
答案 3 :(得分:0)
将您的日志条目写入无撤消临时表。 当代码提交事务或事务处于非活动状态时(transactionID =?),您的代码会将日志条目写出来。
答案 4 :(得分:0)
我认为在ABL中没有任何办法可以做到这一点,因为你有效地计划(在整个地方喷洒临时表冲洗或其他花絮)或者可靠(如果应用程序崩溃与un-正如其他人所提到的那样,临时表变得很红了?我建议通过使数据库写入异步来使您的复杂日志记录与您的应用程序耦合,尽可能在应用程序之外发生。
由于您使用的是Windows,因此可以将日志记录更改为使用.NET log4net库而不是ABL构造。 log4net有一些有用的appenders:
如果必须在ABL中执行此操作,则可以专门为日志消息(OUTPUT TO STREAM
)使用命名输出流,该日志消息将写入外部进程正在侦听的特定位置来处理它。此文件可以是由mkfifo
之类的内容创建的管道,也可以是仅使用inotify
监视更改的常规文本文件(不确定这些内容的Windows等价物)。这个外部进程将处理解析消息并将它们写入数据库(基本上重新发明rsyslog)。
答案 5 :(得分:0)
我喜欢no-undo临时表的想法,只是确保在未处理的异常情况下将数据库写入部分置于“FINALLY”块中。