Controle de transação declarativa
1. Objetos relacionados ao controle de transação programática
1.1 PlatformTransactionManager
A interface PlatformTransactionManager é o gerenciador de transações do spring, que fornece os métodos que normalmente usamos para manipular transações.
Nota:
PlatformTransactionManager é um tipo de interface e diferentes tecnologias da camada Dao têm classes de implementação diferentes. Por exemplo, quando a tecnologia da camada Dao é jdbc ou mybatis: org.springframework.jdbc.datasource.DataSourceTransactionManager
Quando a tecnologia da camada Dao está em hibernação: org.springframework.orm.hibernate5.HibernateTransactionManager
1.2 TransactionDefinition
TransactionDefinition é o objeto de informações de definição da transação, que possui os seguintes métodos:
2 Controle de transação declarativa baseado em XML
2.1 O que é controle de transação declarativa
A transação declarativa do Spring, como seu nome sugere, é usar uma abordagem declarativa para lidar com as transações. A declaração mencionada aqui se refere à declaração no arquivo de configuração, e o processamento de transação declarativa no arquivo de configuração Spring é usado em vez da transação de processamento de código.
A função do processamento de transações declarativas
-
O gerenciamento de transações não invade os componentes desenvolvidos. Especificamente, os objetos de lógica de negócios não perceberão que estão no gerenciamento de transações, e de fato deveriam, porque o gerenciamento de transações é um serviço de nível de sistema, não parte da lógica de negócios. Se você deseja alterar o plano de gerenciamento de transações, você apenas precisa reconfigurar no arquivo de definição
-
Quando o gerenciamento de transações não é necessário, você pode remover o serviço de gerenciamento de transações, desde que modifique o arquivo de configuração sem alterar o código e recompilar, o que é extremamente conveniente de manter
Nota: A camada inferior do controle de transação declarativa do Spring é AOP.
2.2 Implementação de controle de transação declarativa
Questões claras de controle de transação declarativa:
-
Quem é o ponto de corte?
-
Quem é a notificação?
-
Aspecto de configuração?
-
①Introduzir o namespace tx
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
② Aprimoramento de transação de configuração
<!--平台事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--事务增强配置-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
③ Transação de configuração AOP entrelaçada
<!--事务的aop增强-->
<aop:config>
<aop:pointcut id="myPointcut" expression="execution(* com.itheima.service.impl.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut"></aop:advisor>
</aop:config>
④ Testar o código comercial de transferência de controle de transação
@Override
public void transfer(String outMan, String inMan, double money) {
accountDao.out(outMan,money);
int i = 1/0;
accountDao.in(inMan,money);
}
3 Controle de transação declarativa baseado em anotação
3.1 Use anotações para configurar o controle de transação declarativa
- Escreva AccoutDao
@Repository("accountDao")
public class AccountDaoImpl implements AccountDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public void out(String outMan, double money) {
jdbcTemplate.update("update account set money=money-? where name=?",money,outMan);
}
public void in(String inMan, double money) {
jdbcTemplate.update("update account set money=money+? where name=?",money,inMan);
}
}
- Escreva AccoutService
@Service("accountService")
@Transactional
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountDao accountDao;
@Transactional(isolation = Isolation.READ_COMMITTED,propagation = Propagation.REQUIRED)
public void transfer(String outMan, String inMan, double money) {
accountDao.out(outMan,money);
int i = 1/0;
accountDao.in(inMan,money);
}
}
- Grave o arquivo de configuração applicationContext.xml
<!—之前省略datsSource、jdbcTemplate、平台事务管理器的配置-->
<!--组件扫描-->
<context:component-scan base-package="com.itheima"/>
<!--事务的注解驱动-->
<tx:annotation-driven/>
3.2 Análise de controle de transação declarativa de configuração de anotação
① Use @Transactional para modificar as classes ou métodos que precisam de controle de transação. Os atributos disponíveis para anotações são os mesmos dos métodos de configuração xml, como nível de isolamento, comportamento de propagação, etc.
②A anotação é usada na classe, então todos os métodos da classe usam o mesmo conjunto de configuração de parâmetro de anotação.
③Em termos de métodos, métodos diferentes podem usar configurações de parâmetros de transação diferentes.
④ A unidade de anotação da transação a ser aberta no arquivo de configuração Xml <tx: annotation-driven />
3.3 Pontos de Conhecimento
Pontos-chave de configuração para controle de transação declarativa
-
Configuração do gerenciador de transações da plataforma (modo xml)
-
Configuração de notificação de transação (configuração de anotação @Transactional)
-
Tx de configuração orientado a anotações de transação: orientado a anotações /