Existem três tipos de transações Java: transação JDBC, transação JTA (Java Transaction API) e transação de contêiner. Transações comuns de contêiner, como transações de mola. As transações de contêiner são fornecidas principalmente pelos servidores de aplicativos J2EE. A maioria das transações de contêineres é concluída com base no JTA. Esta é uma implementação de API bastante complexa baseada em JNDI. Portanto, este artigo não discutirá as transações de contêineres por enquanto. Este artigo apresenta principalmente duas transações relativamente básicas no desenvolvimento J2EE: transação JDBC e transação JTA.
Transações JDBC
Todos os comportamentos, incluindo transações, do JDBC, são baseados em uma conexão, e o gerenciamento de transações é realizado através do objeto de conexão no JDBC. No JDBC, os métodos comumente usados relacionados à transação são: Setautocomit, Commit, Rollback, etc.
Aqui está um código de transação JDBC simples:
public void jdbctransfer () {java.sql.connection conn = null; tente {Conn = Conn = DriverManager.getConnection ("JDBC: Oracle: Thin: @Host: 1521: SID", "Nome de usuário", "Userpwd"); // Defina o comprometimento automático como false, // Se definido como true, o banco de dados reconhecerá cada atualização de dados como uma transação e enviará automaticamente Conn.SetAutocommit (false); stmt = conn.createstatement (); // Reduza o valor na conta A por 500 stmt.execute ("/ update t_account definido valor = valor - 500 where Account_id = 'a'"); // Aumente o valor na conta B por 500 stmt.execute ("/ update t_account definido valor = valor + 500 onde conta_id = 'b'"); // Enviar transação Conn.Commit (); // CONMITE DE TRANSAÇÃO: A operação em duas etapas da transferência é bem-sucedida ao mesmo tempo} Catch (sqLexception sqle) {try {// ocorre uma exceção, rollback () nesta transação conn.rollback (); // reversão de transações: a operação em duas etapas da transferência revoga completamente o stmt.close (); Conn.Close (); } catch (exceção ignorar) {} sqle.printStackTrace (); }}O código acima implementa uma função de transferência simples, que controla a operação de transferência através de transações, enviando ou rolando.
Prós e contras das transações JDBC
O JDBC fornece o suporte mais básico para operações de transação de banco de dados usando Java. Através de transações JDBC, podemos colocar várias instruções SQL na mesma transação para garantir suas características do ácido. A principal vantagem das transações JDBC é que a API é relativamente simples, pode implementar as operações de transação mais básicas e o desempenho é relativamente bom.
No entanto, as transações JDBC têm uma limitação: uma transação JDBC não pode abranger vários bancos de dados! ! ! Portanto, se várias operações de banco de dados ou cenários distribuídos estiverem envolvidos, as transações JDBC não serão impotentes.
Transações JTA
Por que o JTA é necessário
Geralmente, as transações JDBC podem resolver problemas como a consistência dos dados. Dado que seu uso é relativamente simples, muitas pessoas sabem apenas que existem transações JDBC sobre transações em Java, ou que algumas pessoas sabem sobre transações em estruturas (como hibernato, primavera) etc. No entanto, como o JDBC não pode implementar transações distribuídas e há cada vez mais cenários distribuídos hoje, as transações JTA emergem.
Se você não encontrar cenários que as transações do JDBC não podem ser resolvidas no trabalho, só poderá dizer que os projetos que você está fazendo ainda são muito pequenos. Tome sites de comércio eletrônico como exemplo. Geralmente, dividimos um site de comércio eletrônico horizontalmente em módulos de produtos, módulos de pedidos, módulos de carrinho de compras, módulos de mensagens, módulos de pagamento etc. Em seguida, implantamos diferentes módulos em diferentes máquinas e cada módulo comunica através de chamadas de serviço remotas (RPCs) e outros métodos. Forneça serviços ao mundo exterior com um sistema distribuído.
Um processo de pagamento deve interagir com vários módulos, cada módulo é implantado em uma máquina diferente e os bancos de dados operados por cada módulo são inconsistentes. No momento, o JDBC não pode ser usado para gerenciar transações. Vejamos um pedaço de código:
/ ** Processamento de pedidos de pagamento **/ @Transactional (rollbackfor = excepcion.class) public void completorder () {orderdao.update (); // O pedido de serviço atualiza localmente o pedido de status do pedido de serviço.Update (); // Ligue para o serviço da conta do fundo para adicionar pontos ao fundo da conta de ponto de vista.update (); // Ligue para o Serviço de Pontos para adicionar pontos aos pontos da conta da conta da conta AccountingService.insert (); // Ligue para o Serviço de Contabilidade para escrever o sistema contábil de contabilidade original MerchantNotifyService.Notify (); // Ligue para o Serviço de Notificação do Mercante para enviar notificação de resultado do pagamento ao comerciante}O código acima é uma operação simples do processo de pagamento, na qual cinco serviços são chamados, todos chamados por meio da RPC. Como garantir a consistência da transação usando o JDBC? Adicionei a anotação @Transactional ao método, mas devido ao uso de um serviço distribuído, a transação não pode atingir o efeito do ácido.
As transações JTA são mais poderosas que as transações JDBC. Uma transação JTA pode ter vários participantes, enquanto uma transação JDBC é limitada a uma única conexão de banco de dados. Os componentes de qualquer uma das seguintes plataformas Java podem participar de uma transação JTA: JDBC Connection, JDO PersistEncemanager Objeto, JMS Queue, JMS Topic, Enterprise Javabeans (EJB) e um alocador de recursos compilado com a especificação de arquitetura do conector J2EE.
Definição de JTA
A API de transação Java (JTA) é uma versão Java Enterprise da interface do programa de aplicativos. No ambiente Java, ele permite que as transações distribuídas entre vários recursos XA sejam concluídas.
O JTA e seu Serviço de Transação Java Compatriot (JTS; Java Transactionservice) fornecem serviços de transação distribuídos para a plataforma J2EE. No entanto, o JTA fornece apenas uma interface e não fornece uma implementação específica. Em vez disso, é fornecido pelo provedor de servidor J2EE de acordo com a especificação JTS. Existem várias implementações JTA comuns:
1. Implementação JTA (JBoss) fornecida pelo contêiner J2EE
2. Implementações independentes de JTA: como JOTM, Atomikos. Essas implementações podem ser usadas em ambientes que não usam servidores de aplicativos J2EE para fornecer garantias de transações distribuídas. Como Tomcat, jetty e aplicativos Java comuns.
O JTA fornece java.Transaction.UserTransaction, que define os seguintes métodos.
Aqui, vale a pena notar que as operações JDBC comuns podem ser convertidas diretamente em operações JTA sem usar o UserTransaction. O JTA possui requisitos para DataSource, conexão e recurso. Somente classes que cumprem a especificação XA e implementam as interfaces relevantes da especificação XA podem participar de transações JTA. Em relação à especificação XA, consulte a introdução relevante em outro artigo do meu artigo. Aqui, deixe -me mencionar que os bancos de dados principais atuais suportam a especificação XA.
Para usar transações JTA, você precisa de um driver JDBC que implementa o javax.sql.xadatasource, javax.sql.xaconnection e javax.sql.xaresource Interfaces. Um driver que implementa essas interfaces poderá participar de transações JTA. Um objeto Xadatasource é uma fábrica de um objeto Xaconnection. O Xaconnection é uma conexão JDBC que participa de transações JTA.
Para usar transações JTA, você deve usar o Xadatasource para gerar a conexão do banco de dados e a conexão resultante é uma conexão XA.
A diferença entre a conexão XA (javax.sql.xaconnection) e a conexão não XA (java.sql.Connection) é que o XA pode participar de transações JTA e não suporta começos automáticos.
Código de exemplo:
public void jTatransfer () {javax.transaction.UserTransaction tx = null; java.SQL.Connection Conn = null; tente {tx = (javax.transaction.usertransaction) context.lookup ("java: comp/userTransaction"); // Obter transações JTA, neste caso, o contêiner jboss é gerenciado por javax.sql.datasource ds = (javax.sql.datasource) context.lookup ("java:/xaoracleds"); // Obter o pool de conexão do banco de dados, deve haver um banco de dados e driver que suporta XA que suporta tx.Begin (); Conn = ds.getConnection (); // Defina o comprometimento automático como false, // Se definido como true, o banco de dados reconhecerá cada atualização de dados como uma transação e enviará automaticamente Conn.SetAutocommit (false); stmt = conn.createstatement (); // diminui o valor na conta A por 500 stmt.execute ("/ update t_account definido valor = valor - 500 onde conta_id = 'a'"); // Aumente o valor na conta B por 500 stmt.execute ("/ update t_account definido valor = valor + 500 onde conta_id = 'b'"); // Aumente o valor na conta B por 500 stmt.execute ("/ update t_account definido valor = valor + 500 onde conta_id = 'b'"); // Aumente o valor na conta B por 500 stmt.execute ("/ update t_account definido valor = valor + 500 onde conta_id = 'b'"); // Comprometer transação tx.commit (); // CONMITE DE TRANSAÇÃO: A operação em duas etapas da transferência é bem-sucedida ao mesmo tempo} Catch (sqLexception sqle) {try {// ocorre uma exceção, rollback () nesta transação; // reversão de transações: a operação em duas etapas da transferência é completamente revogada STMT.CLOSE (); Conn.Close (); } catch (exceção ignorar) {} sqle.printStackTrace (); }} O exemplo acima é uma operação de transferência usando transações JTA. Esta operação é relativamente dependente do contêiner J2EE e requer que a transação e a conexão do usuário sejam obtidas por meio do JNDI.
Transações distribuídas padrão
Uma transação distribuída inclui um gerente de transações e um ou mais gerentes de recursos. Um gerente de recursos é um armazenamento de dados persistente de qualquer tipo. O gerente de transações assume a responsabilidade pela comunicação entre todos os participantes da transação.
Veja a introdução acima para transações distribuídas, é semelhante ao gerenciamento de transações em 2pc? No entanto, o 2PC é na verdade um método de implementação para um gerente de transação que cumpre a especificação XA para coordenar vários gerentes de recursos. Eu já tive vários artigos em 2pc e 3pc antes. Nesses artigos, introduzi como o gerente de transações em transações distribuídas coordena a confirmação ou reversão unificada de várias transações. Também apresentarei em detalhes o conteúdo relacionado a transações distribuídas, incluindo, entre outros, transações globais, modelos DTP, transações flexíveis, etc.
Prós e contras do JTA
A vantagem do JTA é que ele fornece uma solução de transação distribuída e ácido rigoroso. No entanto, o gerenciamento padrão de transações JTA não é comumente usado no desenvolvimento diário porque possui muitas deficiências:
Complexo de implementação
Normalmente, o JTA UserTransaction precisa ser obtido no JNDI. Isso significa que, se usarmos o JTA, precisamos usar o JTA e o JNDI.
O próprio JTA é uma API volumosa.
Normalmente, o JTA só pode ser usado em ambientes de servidor de aplicativos; portanto, o uso do JTA limitará a reutilização do código.
Resumir
Existem três tipos de transações Java: transação JDBC, transação JTA (Java Transaction API) e transação de contêiner. Entre eles, o uso da operação de transações da JDBC é relativamente simples e adequado para lidar com operações da mesma fonte de dados. As transações JTA são relativamente complexas e podem ser usadas para lidar com transações em vários bancos de dados. Eles são uma solução para transações distribuídas.
Deixe -me falar brevemente sobre isso aqui. Embora as transações JTA sejam um conjunto de APIs fornecidas pelo Java para transações distribuídas, diferentes plataformas J2EE têm implementações diferentes e não são muito convenientes de usar. Portanto, essa API mais responsável geralmente não é usada em projetos. As soluções de transação distribuídas comumente usadas no setor agora incluem garantia de mensagem assíncrona, TCC, notificação máxima de esforço, etc.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.