图文详解Excel中XLOOKUP函数典型用法整理(xlookup使用方法及实例)
569
2022-05-30
1 事务管理
提供的统一的API接口支持不同的资源
提供声明式事务管理
方便的与spring框架集成
多个资源的事务管理、同步
2 事务抽象
2.1 事务管理器 - PlatformTransactionManager
public interface PlatformTransactionManager { TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; void commit(TransactionStatus status) throws TransactionException; void rollback(TransactionStatus status) throws TransactionException; }
1
2
3
4
5
6
2.2 事务定义 - TransactionDefinition
public interface TransactionDefinition { int getPropagationBehavior(); int getlsolationLevel(); String getName(); int getTimeout(); boolean isReadOnly(); }
1
2
3
4
5
6
7
2.3 事务隔离机制
TransactionDefinition.ISOLATION_DEFAULT TransactionDefinition.ISOLATION_READ_COMMITTED TransactionDefinition.ISOLATION_READ_UNCOMMITTED TransactionDefinition.ISOLATION_REPEATABLE_READ TransactionDefinition.ISOLATION_SERIALIZABLE
1
2
3
4
5
2.4 事务传播机制
TransactionDefinition接口定义了如下int 常量:
PROPAGATION_REQUIRED (Default)
支持当前事务; 如果不存在,请创建一个新的。事务定义的默认设置,并且定义了事务同步的作用域
PROPAGATION_SUPPORTS
支持当前事务; 如果不存在,则以非事务方式执行。
对于具有事务同步的事务管理器, PROPAGATION_SUPPORTS与根本没有事务略有不同,因为它定义了同步可能适用的事务范围。 结果,将为整个指定范围共享相同的资源(JDBC Connection ,Hibernate Session等)。
准确的行为取决于事务管理器的实际同步配置!
通常,请谨慎使用PROPAGATION_SUPPORTS ! 特别是,不要依赖PROPAGATION_SUPPORTS范围内的
PROPAGATION_REQUIRED
PROPAGATION_REQUIRES_NEW (这可能会在运行时导致同步冲突)
如果这种嵌套是不可避免的,请确保正确配置事务管理器(通常切换为“实际事务同步”)
PROPAGATION_MANDATORY
PROPAGATION_REQUIRES_NEW
PROPAGATION_NOT_SUPPORTED
不支持当前事务;而是始终以非事务方式执行。类似于同名的EJB事务属性。
实际的事务中止将无法在所有事务管理器中立即使用。 这尤其适用于org.springframework.transaction.jta.JtaTransactionManager ,它要求javax.transaction.TransactionManager对其可用(在标准Java EE中是特定于服务器的)。
事务同步在PROPAGATION_NOT_SUPPORTED作用域内不可用。 现有同步将被挂起并适时恢复
TransactionDefinition.PROPAGATION_NEVER
不支持当前事务;如果当前事务存在,则抛异常。类似于同名的EJB事务属性。事务同步在PROPAGATION_NEVER作用域内不可用
PROPAGATION_NESTEDED
REQUIRED
适用于增删改
SUPPORTS
适用于查询。
TransactionStatus
Spring提供了PlatformTransactionManager表示事务管理器,所有事务都由它管理。
而事务由TransactionStatus表示。
public interface TransactionStatus extends SavepointManager { boolean isNewTransaction(); boolean hasSavepoint(); void setRollbackOnly(); boolean isRollbackOnly(); boolean isCompleted(); }
1
2
3
4
5
6
7
如果手写事务代码,使用try…catch如下:
TransactionStatus tx = null; try { // 开启事务: tx = txManager.getTransaction(new DefaultTransactionDefinition()); // 相关JDBC操作: jdbcTemplate.update("..."); jdbcTemplate.update("..."); // 提交事务: txManager.commit(tx); } catch (RuntimeException e) { // 回滚事务: txManager.rollback(tx); throw e; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
为啥要抽象出PlatformTransactionManager和TransactionStatus?
JavaEE除了提供JDBC事务,还支持分布式事务JTA(Java Transaction API)。分布式事务是指多个数据源(比如多个数据库,多个消息系统)要在分布式环境下实现事务的时候,应该怎么实现。分布式事务实现起来非常复杂,简单说就是通过一个分布式事务管理器实现两阶段提交,但本身数据库事务就不快,基于数据库事务实现的分布式事务就慢得难以忍受,所以使用率不高。
Spring为了同时支持JDBC和JTA两种事务模型,就抽象出PlatformTransactionManager。
因为我们的代码只需要JDBC事务,因此,在AppConfig中,需要再定义一个PlatformTransactionManager对应的Bean,它的实际类型是DataSourceTransactionManager:
@Configuration @ComponentScan @PropertySource("jdbc.properties") public class AppConfig { ... @Bean PlatformTransactionManager createTxManager(@Autowired DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } }
1
2
3
4
5
6
7
8
9
10
3 代码实战
public OrderService { @Autowire PlatformTransactionManager txManager void buyTicket(BuyTicketDTO dto) { DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION REQUIRED); TransactionStatus status = txManager.getTransaction(def); try { //执行业务代码 txManager.commit(status); } catch (Exception e) { txManager.rollback(status); } } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Transactional标签方式实现1
public OrderService { @Transactonal void buyTicket(BuyTicketDTO dto) { / save order // finish customer pay // transfer tickets } }
1
2
3
4
5
6
7
8
9
Transactional标签方式实现2
public OrderServiceProxy { void buyTicket(BuyTicketDTO dto) { // get and begin transaction manager from context try{ orderServicelmpl.buyTicket(dto); // commit transaction } catch (Exceptione) { // roolbback transaction } }
1
2
3
4
5
6
7
8
9
10
执行原理流程图
PlatformTransactionManager常见实现
DataSourceTransactionManager
JpaTransactionManager
JmsTransactionManager
JtaTransactionManager
但使用声明式事务经常遇到问题:
数据库连接耗尽
处理中的问题(比如调用接口超时)
JDBC Spring
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。