- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 WildFly 8 中,我正在使用包含 Oracle XA 数据源和自定义 JCA LocalTransaction 资源(到文件的连接)的分布式事务。
基本上它按预期工作 - 如果其中一个资源未能提交,整个事务将回滚并且数据库和文件都不会更新/写入。
但是有一个特例。使用 JPA,如果我正在做 entityManager.merge(entity);
并且实体的值与数据库中的值相同,写入文件失败(即因为它不存在),我得到的只是一个警告,我的 EJB 中没有抛出异常:
@Stateless
public class JCABean {
@PersistenceContext(unitName = "file-tx")
private EntityManager entityManager;
@Resource(name = "java:/FileDataSource")
private IDataSource fileDataSource;
public void insert(
final long id,
final String value,
final boolean update) {
final FileTxTest entity = new FileTxTest();
entity.setId(id);
entity.setValue(value);
if (update) {
entityManager.merge(entity);
} else {
entityManager.persist(entity);
}
final File file = new File(FileHelper.BASE_PATH,
String.format("%s.txt", id));
try (final IConnection connection = fileDataSource.getConnection(
file.getAbsolutePath())) {
connection.write(String.format("%s%n", value));
}
}
}
fileDataSource.getConnection()
返回 FileConnection
的实例实现 LocalTransaction
.
如果file
不可写,connection.commit()
抛出 ResourceException
.
如果给entity.setValue()
的值等于数据库中的值(和 update == true
所以合并完成),只发出此警告:
16:33:58,276 WARN [com.arjuna.ats.jta] (default task-4) ARJUNA016039: onePhaseCommit on < formatId=131077, gtrid_length=29, bqual_length=36, tx_uid=0:ffff7f000101:842ac6d:56699b01:22, node_name=1, branch_uid=0:ffff7f000101:842ac6d:56699b01:2a, subordinatenodename=null, eis_name=java:/FileDataSource > (LocalXAResourceImpl@1e22d60[connectionListener=e1ca39 connectionManager=1b9de9e warned=false currentXid=null productName=Generic JCA productVersion=1.0 jndiName=java:/FileDataSource]) failed with exception XAException.XA_RBROLLBACK: org.jboss.jca.core.spi.transaction.local.LocalXAException: IJ001156: Could not commit local transaction
at org.jboss.jca.core.tx.jbossts.LocalXAResourceImpl.commit(LocalXAResourceImpl.java:180) [ironjacamar-core-impl-1.1.9.Final.jar:1.1.9.Final]
at com.arjuna.ats.internal.jta.resources.arjunacore.XAOnePhaseResource.commit(XAOnePhaseResource.java:113)
at com.arjuna.ats.internal.arjuna.abstractrecords.LastResourceRecord.topLevelPrepare(LastResourceRecord.java:152)
如果被合并的实体有一个更新的值,整个交易将按预期失败:
Caused by: javax.transaction.RollbackException: ARJUNA016053: Could not commit transaction.
at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1178)
at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:126)
at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:75)
at org.jboss.as.ejb3.tx.CMTTxInterceptor.endTransaction(CMTTxInterceptor.java:93) [wildfly-ejb3-8.2.1.Final.jar:8.2.1.Final]
如此有效,满足了“全有或全无”的要求,但我希望交易在任何情况下都失败并出现异常,以便我可以引发错误。
Oracle XA 数据源:
<xa-datasource jndi-name="java:/OracleDS" pool-name="OracleDS" enabled="true">
<xa-datasource-property name="URL">
jdbc:oracle:thin:@host.domain.tld:1521:NAME
</xa-datasource-property>
<driver>oracle</driver>
<xa-pool>
<min-pool-size>1</min-pool-size>
<max-pool-size>5</max-pool-size>
<prefill>true</prefill>
</xa-pool>
<security>
<user-name>user</user-name>
<password>pass</password>
</security>
</xa-datasource>
<drivers>
<driver name="oracle" module="com.oracle">
<xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
</driver>
</drivers>
和资源适配器:
<resource-adapters>
<resource-adapter id="file-tx-jca.rar">
<archive>
file-tx-jca.rar
</archive>
<transaction-support>LocalTransaction</transaction-support>
<config-property name="Server">
localhost
</config-property>
<config-property name="Port">
19000
</config-property>
<connection-definitions>
<connection-definition class-name="my.package.GenericManagedConnectionFactory" jndi-name="java:/FileDataSource" pool-name="FileConnectionFactory">
<pool>
<min-pool-size>1</min-pool-size>
<max-pool-size>5</max-pool-size>
</pool>
<security>
<application/>
</security>
</connection-definition>
</connection-definitions>
</resource-adapter>
</resource-adapters>
注意:我知道我最多可以在一个事务中征用一个 LocalTransaction 资源(最后一个资源)。由于我可能需要在同一事务中处理多个文件,因此我更改了 FileConnection
和 <resource-adapter>
到XAResource
/XATransaction
.在这里,如果提交失败(即通过抛出 XAException(XAException.XA_HEURHAZ)
),事务总是失败。但我还是想明白为什么只有本地事务提交失败时才会记录警告。
即使在我目前只收到警告的情况下,我是否可以设置一些属性来获取异常?
最佳答案
我读过 this documentation来自 JBOSS 5 EAP,它描述了当您在涉及其他两阶段感知资源的事务中征用单个单阶段感知资源时使用的 LRCO 算法:
Although the XA transaction protocol is designed to provide ACID properties by using a two-phase commit protocol, model may not always be appropriate. Sometimes it is necessary to allow a non-XA-aware resource manager to participate in a transaction. This is often the case with data stores that do not support distributed transactions.
In this situation, you can use a technique known as Last Resource Commit Optimization (LRCO). This is sometimes called the Last Resource Gambit. The one-phase-aware resource is processed last in the prepare phase of the transaction, at which time an attempt is made to commit it. If the attempt is successful, the transaction log is written and the remaining resources go through the phase-two commit. If the last resource fails to commit, the transaction is rolled back. Although this protocol allows most transactions to complete normally, some errors can cause an inconsistent transaction outcome. For this reason, use LRCO as a last resort. When a single is used in a transaction, the LRCO is automatically applied to it. In other situations, you can designate a last resource by using a special marker interface. Refer to the JBoss Transactions Programmer's Guide for more details.
我的假设如下:当您不修改合并的实体时,在两阶段感知资源事务的准备阶段,撤消日志中不会写入任何内容。
然后,当在准备阶段结束时发生的一阶段资源事务提交失败(文件写入)时,不必为两阶段资源事务撤消任何操作。因此你不会再得到RollbackException,它对应于全局事务中涉及的两阶段资源事务的回滚。
关于jpa - 为什么 LocalXAResourceImpl.commit() 中的异常仅给出警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34207210/
我在使用带有 vector STL 的迭代器时遇到了这个错误。 代码:- #include #include void print_vec(std::vector vec) { auto
JAVA:两个引用“p”&&“pp”之间有区别吗? PrintStream p = new PrintStream(System.out); p.println("lol");
我尝试从主分支中拉出,但收到错误消息: $ git --no-optional-locks -c color.branch=false -c color.diff=false -c color.sta
我面临着一个让我抓狂的问题! 我有一个函数,这个: void load_weapons3(t_env *e, char *name, int x, t_weapon *w) { char
我正在尝试使用 CUDA 中的最小值、最大值、总和和平均值实现并行归约。 这是我目前的主要代码片段。 int main() { const auto count = 8; const
我知道 double free 或 corruption 错误通常是对 big 3 的违规,但在这种情况下,我找不到违规发生的地方。我有一个复制构造函数、析构函数和赋值运算符,适用于任何处理指针的东西
GTK+ 中的“focus”和“focus-in(out)-event”信号有什么区别?哪个先发射?它们与键盘(TAB)和鼠标点击有什么关系。他们互相依赖吗? 我问这个是因为我想在顶层窗口中跟踪当前聚
*** glibc detected *** /home/ghoshs/workspace/Simulator/Debug/Simulator: double free or corruption (
#include #include #include #include using namespace std; #define MAX_WEIGHT 1000000 class Set {
我在服务器上有两个分支一个叫 R2 的分支和一个叫 DEV 的分支我无意中登录了错误的服务器,进入了存储库并执行了GIT pull 源开发但是存储库在 R2 上。所以我意识到我的错误然后尝试通过做一个
我有一个包含循环的大约 1000 个顶点和 3000 个边的有向图。 我试图从给定的顶点找到所有下游(出)路径。 使用以下 Gremlin 查询时 g.V(45712).repeat(out().si
使用 Delphi XE 2 我试图确定缩放方向以将缩放效果应用于图像(TImage),但没有找到执行此操作的函数,并且图像的 OnGesture 事件中的 EventInfo 属性没有此信息. 我见
我正在尝试创建一个 Zoom_image 函数,它使用离散傅里叶变换来缩放灰度图像。如果图像大小小于或等于 4*4 但大小增加,我包含的代码可以工作。它给出“双重释放或损坏(出)中止(核心转储)”错误
当我执行 popAll 函数时,出现以下错误: 双重释放或腐败(出)中止(核心转储) 我想我已经将错误来源缩小到了这个函数。 IntegerStack 是我制作的一个简单的 ADT,其中包含一个名为
我有网络开发背景,我正在尝试创建类似于 this technique 的东西适用于 iOS(使用 Cocoa/Obj C)。我在谷歌搜索资源时遇到了很多困难,因为 iOS 中的“视差”往往指的是 iO
我想实现一个 faceted search对于我的一个项目。我正在使用 PHP5、Mysql 和 Symfony 1.4。显然社区指向Apache Solr这似乎正是我想要完成的。 问题是该网站将在不
我知道有 questions floating around当您没有提供明确的分支名称时,关于来自特定分支的 git pull,但是我想知道即使用户确实指定了不同的分支,是否也可以强制 pull 分支
我正在尝试将我的更改推送到 NAS 上的存储库。它以我无法理解的方式失败。 documentation声明默认情况下 push 仅适用于快进更新。很公平。所以我做了一个 git pull(我的 Rem
我刚开始使用 Oracle 的 Coherence 缓存,我注意到这一点:如果我在缓存中放入一个 ConcurrentHashMap 对象,当我检索它时,我可以看到它被转换为一个普通的 HashMap
我尝试创建一个连接到数据库的线程,从那里获取一些数据并打印到控制台。问题是当该线程完成时抛出异常: 双重免费或腐败(出局)中止(核心转储) 我尝试使用 sqlite3 和 pthread,但这两个并不
我是一名优秀的程序员,十分优秀!