Este artigo estuda principalmente o conteúdo relevante do mecanismo de transação da primavera, como segue.
Geralmente, existem duas estratégias de transação: transações globais e transações locais. As transações globais podem abranger vários recursos transacionais (ou seja, fontes de dados, tipicamente bancos de dados e filas de mensagens) e geralmente exigem o gerenciamento de servidores de aplicativos J2EE, o que requer o suporte ao JTA do servidor na parte inferior. As transações locais estão relacionadas à tecnologia de persistência adotada pela camada subjacente. Se a camada subjacente usar diretamente o JDBC, o objeto de conexão precisará ser usado para operar a transação. Se a tecnologia de persistência de hibernato for usada, você precisará usar o objeto de sessão para operar a transação.
Geralmente, o processo de programação usando transações JTA, transações JDBC e transações de hibernato é aproximadamente o seguinte.
Como pode ser visto na figura acima, usando a programação tradicional de transações, o código do programa deve ser acoplado à API de políticas de transação específicas. Se o aplicativo precisar alternar uma estratégia, significa que o código precisa ser bastante modificado. Mas se você usar transações de primavera, não haverá problema.
O Sring não fornece suporte à transação, é responsável apenas por envolver as transações subjacentes e, no nível da primavera, fornece uma API de programação unificada para o mundo exterior. O núcleo da transação de primavera é a interface PlatformTransactionManager.
O PlatformTransActionManager representa uma interface de transação que é independente do tipo específico e pode representar qualquer transação, incluindo transações JDBC, transações de hiberna e até transações JTA.
O mecanismo de transação de Springma é um modelo de política típico. PlatformTransactionManager representa a interface de gerenciamento de transações, mas não sabe como gerenciar transações. Requer apenas o gerenciamento de transações para fornecer três métodos: Inicie a transação getTransaction(), commit() transações e rollback() No entanto, a implementação específica é deixada para a sua classe de implementação para ser concluída. Os programadores precisam apenas configurar o tipo de transação no arquivo de configuração de acordo com o tipo de transação específico usado. A mola subjacente usará automaticamente a classe de implementação de transação específica para executar operações de transação. Para os programadores, eles não precisam se preocupar com o processo subjacente, eles só precisam programar a interface PlatformTransactionManager. A interface PlatformTransactionManager fornece os seguintes métodos: getTransaction(..), commit(); rollback(); Essas são todas as operações de transação que não estão relacionadas à plataforma.
A redação completa de getTransaction() é TransactionStatus getTransaction(TransactionDefinition definiton)
Este método é usado para retornar um objeto de transação, e o parâmetro transactionDefinition pode especificar vários atributos para o objeto de transação. Geralmente, ele pode especificar os atributos de isolamento dos atributos da transação, propagação, tempo limite e leitura apenas desses atributos.
O gerenciamento específico de transações da Spring exige que o PlatformTransactionManager seja configurado no arquivo de configuração. A seguir, é apresentada a configuração da mola correspondente a diferentes tipos de transações.
A configuração do gerente de transações local da fonte de dados JDBC é a seguinte:
<!-- Define the data source bean, use the C3P0 data source to implement it, and inject the necessary information of the data source --> <bean id="dataSource" destroy-method="close" p:driverClass="com.mysql.jdbc.Driver" p:jdbcUrl="jdbc:mysql://localhost/test" p:user="root" p:password="" p: maxpoolsize = "40" p: minpoolsize = "2" p: InitialPoolSize = "2" p: maxidletime = "30" /> <!-Configure o gerenciador de dados local para JDBC Data Source, use o DataSource.
A configuração do gerente de transações globais da JTA para gerenciamento de contêineres é a seguinte:
<bean id = "DataSource" p: jndiname = "jdbc /jpetstore" /> <!-Usando a classe jTatransactionManager, esta classe implementa a interface PlatformTransactionManager-> <!-usando transações globais JTA, injeção de spring-> Fehtência da Spring-Recursos de transação do JAVATA (!
Para transações globais da JTA, você só precisa especificar a classe de implementação do gerente de transação JTATRANSACIONMANAGER. O contêiner de mola obterá a fonte de dados do servidor J2EE por si só, sem injeção explícita no gerenciador de transações.
A configuração da transação local da primavera com base na tecnologia de persistência de hibernato é a seguinte.
<!-- Define the data source bean, use the C3P0 data source to implement it, and inject the necessary information of the data source--> <bean id="dataSource" destroy-method="close" p:driverClass="com.mysql.jdbc.Driver" p:jdbcUrl="jdbc:mysql://localhost/test" p:user="root" p:password="" p: maxpoolsize = "40" p: minpoolsize = "2" p: InitialPoolSize = "2" p: maxidleTime = "30" /> <!-Definir a fábrica de sessões do hibernato, sessionMactory precisa de contornar a fonte de dados, injeção de dados-> <bEan id = "factore " Usado para listar todas as classes persistentes-> <propriedade name = "annotatedclasses"> <lista> <!-o seguinte é usado para listar todas as classes de PO-> <Value> com.entity.user </valor> </list> </property> <!-Definir a propriedade de sessões do hibernate-> <Nome da propriedade = "HIBNEPROPTIDES"> key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop> <!-- Whether to create data tables based on Hibernate mapping tables--> <prop key="hibernate.hbm2ddl.auto">update</prop> </props> </property> </bean> <!-- Configuring Hibernate's local data Gerenciador, usando a classe HibernateTransactionManager-> <!-Esta classe é uma implementação específica da interface PlatformTransactionManager para Hibernate-> <!-Configurando o HibernateTransactionManager requer sessionfactory-> <Bean ID = "TransactionManager" P: session-ref = "SessionFactory" />
Se as transações da primavera adotarem a política de hibernato, geralmente são necessários três pontos para configurar: fonte de dados, sessionFactory e transação gerente.
Se a camada subjacente usa a tecnologia de camada de persistência de hibernato e a transação usa transação global JTA, a configuração é a seguinte:
<!-Configure a fonte de dados JTA-> <bean id = "DataSource" p: jndiname = "jdbc /jpetstore" /> <!-Definir Hibernate SessionFactory. SessionFactory precisa depender da fonte de dados e injetar o DataSource-> <bean id = "sessionFactory" p: DataSource-ref = "DataSource"> <!-AnoTatedClasses são usados para listar todas as classes persistentes-> <nome da propriedade = "AnotatedClasses"> <list> <!-o seguinte é usado para listar toda </propriedade> <!-Definir a propriedade SessionFactory de Hibernate-> <propriedade name = "HibernateProperties"> <PRESPS> <!-Especifique o dialeto de conexão do hibernato-> <propi key = "hibernate.dialect"> org.hibernate.dialect.mysql5innodbdialEctctialect </propr. -> <prop key = "hibernate.hbm2ddl.auto"> update </spr> </props> </propriedade> </bean> <!-use a classe JTArnsactionManager, que é uma classe de implementação da interface da plataforma "transação" transação específica para a transação global-
Comparado com a transação anterior de mola baseada em hibernato, isso é para substituir a fonte de dados por uma fonte de dados JNDI e substituir o gerenciador de transações por um JTATRANSActionManager.
Para transações globais do JTA, como é necessário o suporte ao servidor de aplicativos subjacente, pode haver diferenças nos detalhes entre as transações globais JTA fornecidas por diferentes servidores de aplicativos. Portanto, ao realmente configurar o gerente de transações globais, pode ser necessário usar subclasses do JTATRANSACIONMANAGER, como OC4JJTATRANSACIONAGERMANAGER fornecido pelo Javaee Application Server, WebLogicJTATRANSActionManager fornecido pelo Oracle para Webs, WebsphereuowtransManager fornecido pelo IBMhere para Webs, Etclogic, Etct, etc.
A partir da configuração da mola de vários tipos de transações acima, pode -se observar que, quando um aplicativo adota o gerenciamento de transações de mola, o aplicativo não precisa ser acoplado à API de transação específica. O aplicativo só precisa ser programado para a interface PlatormTransactionManager. O ApplicationContext selecionará a classe de implementação da política de transação apropriada (ou seja, a classe de implementação do PlatormTransactionManager) com base no arquivo de configuração.
Portanto, em detalhes, como executar a programação de controle de transações na primavera, geralmente existem duas maneiras.
Gerenciamento de transações de programação: é usar diretamente os três métodos abstratos fornecidos pelo PlatormTransactionManager para controlar o fluxo de transações no código. Você também pode obter um feijão do tipo PlatormTransactionManager no recipiente da primavera. Este feijão é sempre uma instância da classe de implementação específica do PlatormTransactionManager. A classe de implementação específica é selecionada pelo ApplicationContext de acordo com o padrão de política. Os programadores não precisam se preocupar com isso, eles só precisam programar orientados a interface.
Gerenciamento de transações declarativas: esse método não exige que o processo de controle da transação seja gravado no código, mas usa a AOP para preencher completamente a incorporação de transações por meio de arquivos de configuração. Ou seja, os arquivos de configuração XML podem configurar agentes de transação para componentes de negócios e os agentes de transação fornecem controle de transações para componentes de negócios. Agora, esse método é o melhor, com a menor intrusão de código -fonte.
Ao usar transações declarativas, você só precisa gravar um arquivo de configuração e configurar os tipos de componentes que requerem controle de transações. Os componentes de negócios serão entusiasmados no controle de transações sob o mecanismo AOP, e os programadores não precisam escrever nenhum código de gerenciamento de transações e podem se concentrar no desenvolvimento de componentes de negócios. Portanto, o gerenciamento de transações declarativo é geralmente recomendado.
O método XML de esquema da Spring fornece uma estratégia concisa de configuração de transação. Ele configura um processamento de aprimoramento da transação através do espaço para nome <tx:advice> , onde vários atributos da transação podem ser especificados (como atributos de isolamento, atributos de propagação, tempo limite, atributos somente leitura, etc.), e o método de aprimoramento da transação pode ser ligado ao ponto de entrada da AOP (i.e. Métodos de Bean em operações de transação. Aqui está um exemplo simples, configurando um feijão NewsdaoImpl para operações de dados, usando a fonte de dados C3P0, o JDBC Transaction Manager da Spring e definindo propriedades para transações em <tx: conselhos.
A configuração completa da primavera é a seguinte:
<? xml versão = "1.0" coding = "utf-8"?> <Beans xmlns: xsi = "http://www.w3.org/2001/xmlschema-innsthance" xmlns = "http://wwwwwwwwwwwww.springrance" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop http://www.springframework.org/schema/tx/spring-tg/schema Fonte de dados Bean, use a fonte de dados C3P0 para implementá-lo e injetar as informações necessárias da fonte de dados-> <bean id = "DataSource" Destroy-Method = "Close" P: DriverClass = "com.mysql.jdbc.driver" p: jdbcur = "jdbc: MySql: // LocalHost/LocalHost/Testes/Testes/Testes/TESTRATH8 e" JiSQL e MySql: // LocalHost/Testes/Testes/Testes/Testes/TESTRATH8 ETSTATHBC. p: user = "root" p: senha = "" p: maxpoolsize = "40" p: minpoolsize = "2" p: InitialPoolSize = "2" p: maxidletime = "30" /> <!-Configure o gerente de dados local da fonte de dados JDBC, use o DataSourSanGerManager Class-> P: DataSource-ref = "DataSource" /> <!-Configure um feijão lógico de negócios-> <bean id = "newsdao" P: ds-ref = "DataSource" /> <!-Configure <TXADVice de melhoria "TXADVICE" TXADVICE "TXADVICE" Txadvice " Definições de transação-> <tx: atributos> <!-Todos os métodos que começam com get são somente leitura-> <tx: método name = "get*" somente leitura = "true" /> <!-Todos os outros métodos estão sujeitos a transações por padrão, especificando um tempo limite de 5 segundos-<tx: name = "*" "isolation = default" < /tx: conselhos> <AoP: config> <!-Configure um ponto de entrada para corresponder à execução de todos os métodos em todas as classes implícitas no pacote Impl-> <aOP: Pointcut Expression = "Execution (*com.dao.impl. conselhos-ref = "txadvice" pointcut-ref = "myPointCut"/> <!-Configure outro ponto de entrada para corresponder à execução de todos os métodos da classe que começam com ABC sob o pacote Impl-> </ap: config> </ Beans>
No código NewsdaoImpl, é para inserir dados duplicados na tabela.
pacote com.dao.impl; importar javax.sql.dataSource; importar org.springframework.jdbc.core.jdbctemplate; importar com.dao.newsdao; public classe newsdaoImpl implementa newsdao {private datasource ds; viddds (stawnstds publicsdaimpl (datArce s). void insert (título da string, conteúdo da sequência) {// Uso do pool de dados C3P0 jdbcTemplate jt = novo jdbctemplate (ds); jt.update ("insert in news_inf" + "valores (100,?,?), title, content); Nenhum controle de transação, o primeiro registro pode ser inserido // Se o controle da transação for adicionado, o primeiro registro não será inserido}}Aqui está o método de teste.
public static void test3 () {ApplicationContext ctx = new ClassPathXMLApplicationContext ("Beans4jdbc.xml"); // Obtenha o agente de transações Bean Newsdao Dao = (Newsdao) ctx.getbean ("Newsdao", newsdao.class); Dao.insert ("Idéia central da programação Java", "Desenvolvimento leve Java EE"); System.out.println ("Execução concluída"); }A execução do método de teste descobrirá que uma exceção é lançada (devido a dados duplicados) e devido ao controle da transação, não haverá inserção de dados no banco de dados.
Como você pode ver no exemplo acima, geralmente na configuração do esquema XML, uma configuração AOP é realmente feita para um feijão comum e um aprimoramento de conselhos é incorporado. O aprimoramento do conselho é configurado com um gerente de transação, que se baseia na fonte de dados.
Para <AOP: Advisor>, a ligação de aconselhamento e ponto de entrada é feita pelo pós -processador de feijão na parte inferior da mola (como o Beannameautoproxycreator, o DefaultAdvisorautoProxycreator), que é essencialmente uma proxy dinâmica.
Além disso, no aprimoramento da configuração <tx: conselhos>, você também pode especificar que, quando uma exceção específica é encontrada, a reversão de força e a força não é uma reversão, ou seja, reversão para = "xxxxException", sem rollback-for = "xxxxException"
Além de usar os métodos de esquema XML, você também pode adicionar diretamente a anotação @Transaction ao método para fazer esse método ter propriedades transacionais. Na @Transaction, várias propriedades podem ser configuradas para transações (como propriedades de isolamento, propriedades de propagação, tempo limite, propriedades somente leitura, etc.). Além disso, é necessário adicionar uma configuração <tx: anotação à configuração XML, indicando que a mola configurará o agente de transação de acordo com a anotação, de modo que a configuração da propriedade da transação e o configuração de corte AOP possa ser concluído em apenas uma etapa (diretamente através da antação do nome do método).
<tx: transação orientada por anotação-manager = "transactionManager" />
Newsdaoimpl.
@Transactional (propagação = propagação.Required, isolation = isolation.default, timeout = 5) @OverridePublic void Insert (título da string, conteúdo da string) {O exposto acima é o conteúdo inteiro deste artigo sobre o código de exemplo do mecanismo de transação da primavera, e espero que seja útil para todos. Amigos interessados podem continuar se referindo a outros tópicos relacionados neste site. Se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio para este site!