-
Bug
-
Resolution: Done
-
Major
-
7.7.1
-
None
Description of problem:
2nd connection to Multi-Source Model Dynamic VDB is not Two-Phase Commit.
How reproducible:
Always
Steps to Reproduce:
Execute a update query via Multi-Source Model Dynamic VDB.
ex)
vdb - maseter-vdb.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<vdb name="MASTER-VDB" version="1">
<description>A Dynamic VDB</description>
<property name="UseConnectorMetadata" value="true" />
<model visible="true" type="PHYSICAL" name="VDB1">
<property name="supports-multi-source-bindings" value="true" />
<source name="db02" translator-name="postgresql" connection-jndi-name="java:/PostgresXADS02" />
<source name="db01" translator-name="postgresql" connection-jndi-name="java:/PostgresXADS01" />
</model>
</vdb>
Additional info:
Set the multisourceUpdate flag as first query plan creating.
org.teiid.dqp.internal.process.multisource.MultiSourcePlanToProcessConverter.java
90: @Override
91: public synchronized RelationalPlan convert(PlanNode planNode)
92: throws QueryPlannerException, TeiidComponentException {
93: RelationalPlan result = null;
94: try
finally {
98: if (result != null && update && multiSource)
101: update = false;
102: multiSource = false;
103: }
104: }
If multisourceUpdate is true, transactionService is started by teiid engine. But, second connects does not set the multisourceUpdate flag. Therefore, teiid engine does not start transactionService.
org.teiid.dqp.internal.process.Request.java
338: private void createProcessor() throws TeiidComponentException {
— snip —
349: if(RequestMessage.TXN_WRAP_ON.equals(requestMsg.getTxnAutoWrapMode()))
else if (RequestMessage.TXN_WRAP_DETECT.equals(requestMsg.getTxnAutoWrapMode()))
{ 352: boolean transactionalRead = requestMsg.getTransactionIsolation() == Connection.TRANSACTION_REPEATABLE_READ 353: || requestMsg.getTransactionIsolation() == Connection.TRANSACTION_SERIALIZABLE; -> 354: startAutoWrapTxn = processPlan.requiresTransaction(transactionalRead); 355: }
356:
357: if (startAutoWrapTxn) {
358: try
catch (XATransactionException err)
{ 361: throw new TeiidComponentException(err); 362: }363: }
364: }
org.teiid.query.processor.relational.RelationalPlan.java
254: @Override
255: public boolean requiresTransaction(boolean transactionalReads) {
256: if (multisourceUpdate)
259: if (this.with != null) {
260: if (transactionalReads)
263: for (WithQueryCommand withCommand : this.with) {
264: if (withCommand.getCommand().getProcessorPlan().requiresTransaction(transactionalReads))
267: }
268: }
279: return requiresTransaction(transactionalReads, root);
270: }