Garantir o commit em 2 sessões diferentes

Pessoal,

Alguém já precisou garantir o commit de 2 sessões diferentes (oracle) ?

O caso é, tenho uma transação que precisa acontecer, porém parte dela ocorre em um banco e outra parte em outro banco (outro servidor).

Se eu garantir o commit da primeira sessão, não posso dar rollback nela caso a segunda tenha problemas e vice-versa.

Alguém tem alguma sugestão?

Obs: Linked Server, replicação, etc. não podem ser utilizadas. :lol:

Obrigado pela atenção.

[]'s

Leandro, vc andou faltando nas aulas do vilma?

Tua única solução é usar transações distribuidas. Fale com teu dba para informar como acessar o DTC via XA do teu banco.
Feito isso use JTA para controlar tuas transações, em vez de simplesmente JDBC, atravez de um fonte de dados XA.
Se voce estiver usando um AS isso vai ser mais facil que simplesmente com um servlet-container.


Falha tecnica…

Por que vc não pode dar os dois commits no fim de tudo ???

try {

stmt = conn1.prepareStatement(“update asdfasdfasf”);
stmt.executeUpdate();
stmt.close();

stmt = conn2.prepareStatement(“insert adsfasdfsad”);
stmt.executeUpdate();
stmt.close();

conn1.commit();
// se der merda aqui aí vc se ferrou mesmo…
// a chance é bem pequena mas existe !!!
conn2.commit();

} catch(SQLException e) {
try { conn1.rollback(); } catch(Exception e) { }
try { conn2.rollback(); } catch(Exception e) { }
}

[quote=“saoj”]Por que vc não pode dar os dois commits no fim de tudo ???
try {

stmt = conn1.prepareStatement(“update asdfasdfasf”);
stmt.executeUpdate();
stmt.close();

stmt = conn2.prepareStatement(“insert adsfasdfsad”);
stmt.executeUpdate();
stmt.close();

conn1.commit();
// se der merda aqui aí vc se ferrou mesmo…
// a chance é bem pequena mas existe !!!
conn2.commit();

} catch(SQLException e) {
try { conn1.rollback(); } catch(Exception e) { }
try { conn2.rollback(); } catch(Exception e) { }
}[/quote]

Pq ai voce tem 2 transações em vez de uma só como ele precisa. Sua sugestão deixa o sistema a merce do azar.

[quote]
Pq ai voce tem 2 transações em vez de uma só como ele precisa. Sua sugestão deixa o sistema a merce do azar.[/quote]

Eu percebi, tanto é que eu coloquei um comentário entre os dois commits.

Como se resolve isso, isto é, como fazer com que os dois commits sejam atômicos se eu tenho duas conexões diferentes :?:

Usa um DTC ue, simples assim. Ele vai te fazer o trabalho sujo do 2-phase commit, que é a forma mais comum de implementar transações distribuidas.