Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java spring中需要的事务属性?_Java_Spring_Jakarta Ee_Spring Transactions - Fatal编程技术网

Java spring中需要的事务属性?

Java spring中需要的事务属性?,java,spring,jakarta-ee,spring-transactions,Java,Spring,Jakarta Ee,Spring Transactions,在上给出的第一个案例研究中, 程序正在调用两个方法,即 testModel.deleteAllCountries(); testModel.initializeCountries(); 其中initializeCountries引发运行时异常。对于这两种方法,都需要“事务定义”属性。仍在删除所有国家/地区下进行交易 方法被提交,但initializeCountries下的事务被回滚(根据同一案例研究中给出的日志) 根据您的要求,定义为支持当前事务;如果不存在,则创建一个新的。所以我这里的问题是

在上给出的第一个案例研究中, 程序正在调用两个方法,即

testModel.deleteAllCountries();
testModel.initializeCountries();
其中initializeCountries引发运行时异常。对于这两种方法,都需要“事务定义”属性。仍在删除所有国家/地区下进行交易 方法被提交,但initializeCountries下的事务被回滚(根据同一案例研究中给出的日志)

根据您的要求,定义为支持当前事务;如果不存在,则创建一个新的。所以我这里的问题是initializeCountries方法下的事务 应支持deleteAllCountries方法下的事务。我的意思是,这两种方法都应该被视为单一交易。根据我的理解,是否应该提交或回滚完整的事务?不确定日志是如何单独处理它们的。

将“需要传播”定义为

支持当前事务,如果不存在,则创建新事务

在上面的例子中,deleteAllCountries方法在事务中执行并提交。调用initializeCountries时没有当前事务,因此它在第二个事务中执行,回滚它对第一个方法所做的更改没有影响

传播适用于嵌套的方法调用,而不是连续的方法调用。如果你看:

当需要传播设置时,逻辑 事务作用域是为设置所基于的每个方法创建的 应用每个这样的逻辑事务范围都可以确定 使用外部事务作用域单独回滚状态 逻辑上独立于内部事务范围。属于 当然,对于标准的传播行为,所有这些 作用域将映射到同一物理事务。那么 内部事务作用域中设置的仅回滚标记不会影响 外部事务实际提交的机会(如您所料 是的

但是,在内部事务范围设置 仅回滚标记,外部事务尚未决定 回滚本身,因此回滚(由内部 事务范围)是意外的。相应的 此时将抛出UnexpectedRollbackException。这是意料之中的 使事务调用方永远不会被误导的行为 假设提交是在实际不执行的情况下执行的。所以如果 内部事务(外部调用方不知道)以静默方式进行 将事务标记为仅回滚,外部调用方仍然调用 犯罪外部调用方需要接收一个 UnexpectedRollbackException,用于清楚地指示已执行回滚 而是表演

然后你可以看到所有这些都是关于内部和外部的,没有一个提到连续的调用。在您的例子中,对deleteAllCountries的调用是最外层的事务方法,因此当它成功完成时,Spring会立即提交事务。然后,对initializeCountries的调用必须在单独的事务中执行,其中它是最外层的方法


您的假设似乎是Spring将在第一个方法完成后保持事务打开,但它不是这样工作的。为了获得想要的效果,您可以在testModel上创建另一个方法,该方法包装对deleteAllCountries和initializeCountries的调用,使该方法具有事务性,并为其提供所需的属性。这样,第二个方法的回滚将导致第一个方法的更改也被回滚,因为包装方法将它们分组在一起。否则,没有任何东西能告诉Spring这些东西应该是同一笔交易的一部分。

谢谢Nathan。但在浏览链接后,我又问了一些问题。有两种说法。Statement1—每个这样的逻辑事务作用域都可以单独确定仅回滚状态,外部事务作用域在逻辑上独立于内部事务作用域。语句2——当然,在标准的传播行为中,所有这些作用域都将映射到同一个物理事务。因此,内部事务作用域中设置的仅回滚标记确实会影响外部事务实际提交的机会(正如您所期望的那样)。在语句1中,哪个是外部事务,哪个是内部事务。状态2中:-哪一个是相同的物理事务here@Mohit当前位置问题是,两者都不是外在的,也不是内在的,这是不适用的。事实上,内森,我正试图理解这个陈述的含义但是,在内部事务作用域设置仅回滚标记的情况下,外部事务尚未决定回滚本身,因此回滚(由内部事务作用域无声触发)是意外的。此时会引发相应的UnexpectedRollbackException。“对不起,你能帮我举个简单的例子,说明哪些是内部交易条款,哪些是外部交易条款吗?”?谢谢你advance@mohit:在我建议的修复中,包装器方法是外部的,现有方法是内部的。但让我们看看还有什么其他答案,也许有人能比我解释得更好。有一些非常可靠的专家应该看到这一点。