如何配置事务记录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何配置事务记录相关的知识,希望对你有一定的参考价值。

参考技术A 你好,非常高兴为你解答:
在服务器上启用事务记录可以使系统捕获数据库的改变并将它们写入到事务记录中,这样当系统或介质出问题时您可以使用事务记录和第三方的备份软件来恢复数据库。下面就介绍如何配置事务记录(transaction log)。
1、确保被记录的所有数据库都在Domino数据目录或其子目录下
2、启动Administrator软件,点击"配置"标签
3、在"使用目录"域,选择该服务器的Domino目录
4、选择"服务器"视图下的"当前服务器文档"子视图,打开并编辑服务器文档
5、点击"事务记录"标签,完成以下域:

事务记录:启用,缺省是禁用
日志路径:填写相对于Domino数据目录的路径,例如(logdir)
使用日志设备上的所有可用空间:是否使用设备上所有可用的空间来进行事务记录
如果选择"否",则在下面的域中填写"最大日志空间"最大日志空间:事务记录所使用的最大尺寸,以MB为单位.缺省是192MB,最大是4096MB.根据您分配的最大日志空间,Domino生成最少3个,最多64个日志文件
自动修正已损坏数据库:
选择"启用":如果数据库损坏,并且Domino不能使用事务记录来恢复它,则Domino运行Fixup任务,分配新的DBIID,并通知管理员做新的备份
选择"禁用":Domino不自动运行Fixup任务,而是通知管理员对损坏的数据库手工运行Fixup任务(带-J参数).如果事务记录在正常工作,不需要启用该选项.运行时间/重新启动惯用选项:该域控制Domino以什么频率在事务记录中记录恢复断点,它影响服务器的性能。
标准:(缺省并推荐)经常记录断点
运行时间:记录较少的断点,它要求较少的系统资源,会提高服务器的运行性能
重启恢复时间:记录很多的断点,它会减少服务器重新启动的恢复时间
记录样式:
循环:(缺省)连续地重用日志文件,覆盖旧的日志文件,您只能恢复记录在事务记录中的日志文件。
归档:(推荐)只有当日志文件被归档后,才重用日志文件.当日志文件处于不激活状态时(即不包含重新启动时的必要的恢复信息时),可以将它归档.使用
第三方的备份程序来拷贝和归档当前的日志.当Domino使用当前的文件再启动时,它增加日志文件的名称. 如果所有日志文件是不激活的并且没有被
归档,Domino创建附加的日志文件。
重新启动服务器生效。
当您重新启动服务器后,您将在控制台上看到如下信息:
Recovery Manager: Assigning new DBIID for f:\Lotus\Domino\Data\databasename.nsf (need new backup for media recovery).
它将为每一个需要事务记录的数据库分配一个新的DBIID.
另外,Domino创建事务日志文件(.TXN文件)和控制文件(nlogctrl.lfh),并将它们放在\logdir目录下。

记录一次Spring事务线上异常

Spring事务管理配置方式:

  • XML模糊匹配,绑定事务管理
  • 注解,可对每个需要进行事务处理的方法单独配置,只需 @Transactional,然后添加属性配置

为简便,本文使用注解方式。Spring初始化时,会通过扫描拦截对事务的方法进行增强。若目标方法存在事务,Spring就会创建一个Bean对应的代理(Proxy)对象,并进行相关的事务处理操作。

1 setup

1.1 数据库配置文件 jdbc.properties

1.2 JDBC配置类

从 jdbc.properties 加载相关配置项,并创建 JdbcTemplate、DataSource、TransactionManager 等相关Bean。

1.3 应用配置类

通过注解,配置了数据源、MyBatis Mapper 的扫描路径以及事务等。

2 unchecked 异常与事务回滚

用户管理功能,每位用户注册后,都往数据库里存入信息:

Mapper类:

数据库表Schema:

业务类 StudentService包括一个保存的方法 saveStudent。执行一下保存,一切正常。

测试该事务是否回滚:若发现用户名=JavaEdge,抛异常,触发事务回滚。

测试保存我这个用户:

执行结果打印出了这样的信息:

异常抛了,但观察到DB还是有条新记录。

那为何异常也抛了,却没有回滚?

3 源码解析

顺着 saveUser debug:

看到 CglibAopProxy,事务本质上也是一种特殊切面,在创建过程中,被 CglibAopProxy 代理。
事务处理拦截器是 TransactionInterceptor支撑整个事务功能的架构

TransactionInterceptor如何实现事务特性


执行代理类的目标方法时,触发invoke()。跳到异常处理。catch到异常时,调 completeTransactionAfterThrowing进一步处理。

TransactionAspectSupport#invokeWithinTransaction

completeTransactionAfterThrowing.rollbackOn()

事务回滚判断条件。条件满足时,即会触发事务回滚。

RuleBasedTransactionAttribute#rollbackOn()

RuleBasedTransactionAttribute自身的rollbackOn()

当在 @Transactional 配置 rollbackFor,该方法就会用捕获到的异常和 rollbackFor 中配置的异常比对:

  • 所捕获异常是 rollbackFor 配置异常,直接 rollback

案例中,没有加任何规则,所以找不到规则去处理(所以 winner == null),进而走到下一步。

DefaultTransactionAttribute 的 rollbackOn()

当发生如下 case:

  • 没有在 @Transactional 配置 rollback 属性
  • 或者,捕获到的异常和所配置异常类型不一

就调用父类rollbackOn():

只有异常类型为 RuntimeException 或 Error,才true
=》才触发 completeTransactionAfterThrowing#rollback
=》事务才回滚:

综上,Spring 处理事务时,若没有在 @Transactional 配置 rollback 属性,则只有捕获到 RuntimeException 或 Error 才会触发事务回滚。
而案例抛 Exception,又未指定回滚规则,所以未触发回滚。

4 修正

将所抛异常类型改成 RuntimeException:

这种修改方法不优雅,毕竟异常有时就是固定死不能修改。还有更好方案。

解析 RuleBasedTransactionAttribute#rollbackOn 的代码时提到过 rollbackFor 属性的处理规则。在 @Transactional 的 rollbackFor 加入要支持的异常类型(在这是 Exception)即可匹配上我们所抛异常。完善注解配置即可:

以上是关于如何配置事务记录的主要内容,如果未能解决你的问题,请参考以下文章

如何配置propagation

weblogic 下如何配置 JTA事务管理??

java的框架spring如何配置分布式事务?

如何配置 Spring Boot 应用程序以使用 aspectj 事务?

如何将BSP应用配置成Fiori Launchpad上的一个tile

如何将BSP应用配置成Fiori Launchpad上的一个tile