1. Exemplos de cenários de uso
Antes de entendermos como o @Transaction é usado, devemos primeiro saber o que o @Transaction é útil. Deixe -me dar um polegar para cima: por exemplo, existem muitos membros em um departamento, e esses dois são armazenados na tabela de departamento e na tabela de membros, respectivamente. Ao excluir um determinado departamento, suponha que excluímos os membros correspondentes por padrão. No entanto, isso pode ocorrer durante a execução. Primeiro excluímos o departamento e depois excluímos os membros. No entanto, o departamento o excluiu com sucesso e ocorreu uma exceção ao excluir os membros. No momento, esperamos que, se a exclusão do membro falhar, o departamento excluído anteriormente também cancelará a exclusão. Esse cenário pode ser revertido usando @Transactional Things.
2. Exceção verificada e exceção desmarcada
A razão pela qual deixamos todos saberem os conceitos de exceções verificadas e exceções desmarcadas é que:
A primavera usa o processamento de transações declarativas. Por padrão, se ocorrer uma exceção desmarcada no método de operação de banco de dados anotado, todas as operações do banco de dados serão reversivas; Se a exceção ocorrer for uma exceção verificada, as operações do banco de dados ainda serão enviadas por padrão.
Exceção verificada:
Inválido, não previsível no programa. Por exemplo, entrada inválida do usuário, o arquivo não existe, erros de link de rede ou banco de dados. Estes são todos os motivos externos e não são controlados pelo programa.
Deve ser tratado explicitamente no código. Por exemplo, try-capatch block processing ou lançar a exceção à camada anterior da pilha de chamadas com a descrição dos arremessos.
Herdado de java.lang.Exception (exceto java.lang.runtimeException).
Exceção sem controle:
Indica um erro, a lógica do programa está errada. É uma subclasse da RuntimeException, como ilegalArgumentException, NullPointerException e IllegalStateException.
Não há necessidade de capturar explicitamente exceções desmarcadas no código para processamento.
Herdado de java.lang.runtimeException (e java.lang.runtimeException herda de java.lang.exception).
Olhando para o diagrama de estrutura anormal abaixo, pode ser mais em camadas:
3. Exemplo de uso de @transactional
Este exemplo usa o Eclipse+Maven. O MAVEN é gerenciado apenas como uma jarra, e até amigos de macacos de Maven que não entendem podem entendê -lo.
3.1. Arquivo de configuração da primavera
O espaço para nome do TX deve ser configurado primeiro como segue:
Para usar o gerenciamento de transações baseado em transações, é necessária a seguinte configuração na primavera:
<bean id = "AppTransactionManager"> <propriedade name = "DataSource" ref = "DataSource" /> </i bean> <tx: Proxy-Target-class = "false", orientado por anotação, "AppTransactionManager" />
O arquivo de configuração de primavera inteiro do blogueiro:
<? xml versão = "1.0" coding = "utf-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http:/wwww.w3 xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-Introduzir Arquivo de Configuração do JDBC-> <Bean id = "PropertyConfigurer"> <propriedade name = "Localizações"> <List> <Value> ClassPath: Properties/*. Propriedades </Value> <!-Se existem vários arquivos de configuração, apenas continue a adicionar aqui-> </list> </property> </beins> <!- <!-Configurar Propriedades-> <!-Configurar propriedades-> <!-Configurar Propriedades-> <!-<Property Name = "DriverClassName" value = "com.mysql.jdbc.driver" /> <nome da propriedade = "url" = "jdbc: mysql: // localhost: 330: 330) <property name="password" value="christmas258@" /> --> <!-- Use properties to configure --> <property name="driverClassName"> <value>${jdbc_driverClassName}</value> </property> <property name="url"> <value>${jdbc_url}</value> </property> <property name="username"> <Value> $ {JDBC_USERNAME} </Value> </Property> <propriedade name = "senha"> <value> $ {jdbc_password} </value> </oilter Proxy-Target-Class = "false" Transaction-manager = "AppTransactionManager" /> <!-Digitalize automaticamente todos os arquivos de interface do mapeador correspondentes a xxxxmapper.xml, para que você não precise configurar manualmente o mapeamento MPPER um por um. Enquanto a classe de interface do mapeador e o arquivo de mapeamento do mapeador corresponderem um ao outro. -> <Bean> <propriedade name = "BasEpackage" value = "com.luo.dao" /> </i bean> <!-Configure o arquivo mybatis, MapperLocações configuradas ** Mapper.xml Localização do arquivo datringsing (configlocation mybatis-config Localização de arquivo "<iBean =" sqsling, "SQLSLOTIONSTINGSTINGSETIONSTESTIONSTESTIONSTUSTIONSTESTUSTESTUSTIONSTESTUSTIMENTES (" ref = "DataSource"/> <propriedade name = "mapperLocações" value = "classPath: mapper/*. xml"/> <propriedade name = "configLocation" value = "classPath: mybatis/mybatis-config.xml"/> <! <!-Digitalizada automaticamente os feijões anotados-> <Contexto: componente-Scan-Package = "com.luo.service" /> </sieva>3.2. Use @Transaction para adicionar anotações ao método da classe de implementação do usuário
@Transactional (propagação = propagação.Required) public void adduser (usuário do usuário) {userdao.adduser (usuário); String string = null; if (string.equals ("")) {int i = 0; }}No método acima, eu deliberadamente o fiz ter uma exceção de ponteiro nulo e as coisas vão reverter
3.3. Execute a classe de teste de unidade
@Test public void addUSerTest () {usuário do usuário = new User (); user.setUserName ("luoguohui1"); user.setUserPassword ("luoguohui1"); UserService.adduser (Usuário);}Descobri que ele não poderia ser inserido, mas se o @Transaction for removido, o código será o seguinte. Embora ocorra uma exceção, ainda existem dados correspondentes adicionados ao banco de dados:
3.4. Download do código -fonte
Faça o download do código -fonte final deste artigo: First_Maven_Project_JB51.rar
4. Os conceitos que @transactional na primavera devem ser entendidos
O @Transactional na primavera é baseado no mecanismo dinâmico de proxy e fornece um mecanismo de gerenciamento de transações transparente para facilitar e resolver rapidamente os problemas encontrados no desenvolvimento.
Geralmente, é para comentar métodos ou interfaces ou classes através do seguinte código:
@Transaction (propagação = propagação.not_supported)
A propagação suporta 7 mecanismos diferentes de propagação:
Necessário: Se existir uma transação, a transação atual será suportada. Se não houver transação, uma nova transação será iniciada.
Suporta: Se existir uma transação, a transação atual será suportada. Se não houver transação, a execução da não transação. No entanto, para gerentes de transação de sincronização de transações, a propagação_supports é ligeiramente diferente de não usar transações.
NOT_SUPPORTED: Sempre execute não-transacionalmente e suspenda qualquer transação existente.
RequerNew: sempre inicie uma nova transação. Se já existir uma transação, a transação existente será suspensa.
Obrigatório: se já existir uma transação, suporte a transação atual. Se não houver transação ativa, uma exceção será lançada.
Nunca: sempre execute não transacional, se existir uma transação ativa, uma exceção será lançada
Ninhado: Se existir uma transação ativa, ela será executada em uma transação aninhada. Se não houver transação ativa, pressione a propriedade necessária para executar.
Aqui estão algumas coisas a serem observadas, que devem ser lidas, caso contrário, se você encontrar várias armadilhas, o blogueiro não o lembrou:
Aqui estão algumas coisas a serem observadas, que devem ser lidas, caso contrário, se você encontrar várias armadilhas, o blogueiro não o lembrou:
Aqui estão algumas coisas a serem observadas, que devem ser lidas, caso contrário, se você encontrar várias armadilhas, o blogueiro não o lembrou:
Adicione @Transaction Anotation, onde o gerenciamento de transações é necessário. As anotações @Transaction podem ser aplicadas a definições de interface e métodos de interface, definições de classe e métodos públicos de classes.
@Transaction Anotações só podem ser aplicadas a métodos com visibilidade pública. Se você usar a anotação @Transactional em métodos protegidos, privados ou visíveis, ela não relatará um erro, mas esse método anotado não exibirá as configurações de transação configuradas.
Observe que a ocorrência da anotação @Transactional não é suficiente para permitir o comportamento da transação, é apenas uma espécie de metadados. O elemento de configuração deve ser usado no arquivo de configuração para realmente ativar o comportamento da transação.
Controla se um proxy baseado em interface ou baseado em classe é criado através do valor do atributo de "classe proxy-alvo" do elemento. Se o valor do gênero "Classe de alvo proxy" estiver definido como "TRUE", o proxy baseado em classe funcionará (isso é necessário para cglib.jar no ClassPath). Se o valor do gênero "Classe de alvo proxy" estiver definido como "false" ou essa propriedade for omitida, o proxy baseado em interface JDK padrão funcionará.
A equipe da primavera recomenda o uso da anotação @Transactional em classes (ou métodos de classes) específicas, em vez de em quaisquer interfaces que a classe deseje implementar. O uso da anotação @Transaction em uma interface só entrará em vigor quando você configurar um proxy baseado em interface. Como as anotações não podem ser herdadas, isso significa que, se um proxy baseado em classe estiver sendo usado, as configurações de transação não serão reconhecidas pelo proxy baseado em classe e o objeto não será envolvido pelo proxy da transação.
A transação da @transacional está ativada, é criada um proxy baseado em interface ou baseado em classe. Portanto, na mesma classe, um método chama outro método com transações, a transação não funcionará.
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.