事务就是对一系列的数据库操作进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。这样可以防止出现脏数据,防止数据库数据出现问题。同样,Spring事务管理对Spring中数据的处理起到了至关重要的作用。而Spring事务管理的核心内容就是Spring事务管理核心接口。
在实际开发中,操作数据库时都会涉及到事务管理问题,为此Spring提供了专门用于事务处理的API。Spring 的事务管理简化了传统的事务管理流程,并且在一定程度上减少了开发者的工作量。Spring中的事务管理机制,一般是使用TransactionMananger进行管理,可以通过Spring的注入来完成此功能。
图述Spring事务管理的核心接口:
Spring用于事务管理的依赖包: spring-tx-4.3.6.RELEASE 的JAR包,在该JAR包的org.springframework.transaction包中,有3个接口文件PlatformTransactionManager、TransactionDefinition TransactionStatus 。
PlatformTransactionManager即平台事务管理器,它是事务的核心接口,主要用于管理事务。该接口中提供了三个事务操作的方法,具体如下:
TransactionStatus getTransaction(TransactionDefinition definition):用于获取事务状态信息
void commit(TransactionStatus status):用于提交事务
void rollback(TransactionStatus status):用于回滚事务
在上面的3个方法中,getTransaction(TransactionDefinition definition)方法会根据TransactionDefinition参数返回一个TransactionStatus对象,TransactionStatus对象就表示一个事务,它被关联在当前执行的线程上。PlatformTransactionManager接口只是代表事务管理的接口,并不知道底层是如何管理事务的,具体如何管理事务则由它的实现类来完成。该接口常见的几个实现类如下:
其中前两个只支持单一数据源,JtaTransactionManager支持多数据源。比如说实际中一个数据库在A地,另一个数据库在B地。要想封装这两个数据库为同一个事务,就只能使用JtaTransactionManager。当底层采用不同的持久层技术时,系统只需要使用不同的PlatformTransactionManager实现类即可。
TransactionDefinition接口是事务定义(描述) 的对象,该对象中定义了事务规则,并提供了获取事务相关信息的方法。TransactionDefinition用于描述事务的隔离级别、超时时间、是否为只读事务和事务传播规则等控制事务具体行为的事务属性,这些事务属性可以通过XML配置或注解描述提供,也可以通过手工编程的方式设置。
String getName();获取事务对象名称
int getIsolationLevel();获取事务的隔离级别
int getPropagationBehavior();获取事务的传播行为
int getTimeout();获取事务的超时时间
boolean isReadOnly();获取事务是否只读
上述方法中,事务的传播行为是指在同一个方法中,不同操作前后所使用的事务。
在事务管理过程中,传播行为可以控制是否需要创建事务以及如何创建事务,通常情况下,数据的查询不会影响原数据的改变,所以不需要进行事务管理,而对于数据的插入、更新和删除操作,必须进行事务管理。如果没有指定事务的传播行为,Spring默认传播行为是REQUIRED。
TransactionStatus接口是事务的状态,它描述了某一时间点上事务的状态信息。该接口中包含6个方法, 具体如下:
void flush();刷新事务
boolean hasSavepoint();获取是否存在保存点
boolean isCompleted();获取事务是否完成
boolean isNewTransaction();获取是否为新事务
boolean isRollbackOnly();获取事务是否回滚
void setRollbackOnly();设置事务回滚,通过该标识通知事务管理器只能将事务回滚,事务管理器将通过显式调用回滚命令或抛出异常的方式回滚事务。
其实,总的来说,Spring事务管理核心接口只有三个,似乎只要稍微花一点时间并不难掌握。但里面涉及到的东西还是不少的,至少我们需要耗时去加深理解,才能说自己完全掌握了Spring事务管理核心接口。当然,这只是学习Spring框架的一个小小挑战,还有更多的复杂的知识在未知的未来等着我们学习和探索!
HelloWorld10-31 08:24
军哥08-12 23:29
江湖人称小李白12-10 10:41
IT逐梦者08-17 21:43
HelloWorld11-06 11:19