关于事务处理
事务为了保证数据的一致性和完整性,保证整个操作的原子性。
编程式事务
需要在代码中直接加入事务的逻辑,可能需要在代码中显式的调用beginTransaction()、commit()、roolback()等事务管理相关的方法。
需要在方法开始的时候开启事务,处理完后,在方法结束的时候,关闭事务。
编程式事务侵入性较强,但处理粒度更细。
声明式事务
在方法的外围添加注解或者直接在配置文件中定义。当方法需要处理事务,在Spring中会通过配置文件在方法的前后拦截,并添加事务。
Spring提供两种方式的编程式事务处理:
· 使用TransactionTemplate
· 直接使用一个PlatformTransactionManager实现
相关接口
public interface PlatformTransactionManager{ // 返回一个已激活的事务或者创建一个新事务,返回的TransactionStatus代表当前事务的状态 TransactionStatus getTransaction(TransactionDefinitiondefinition) throws TransactionException; // 提交 void commit(TransactionStatus status) throws TransactionException; // 回滚 void rollback(TransactionStatus status) throwsTransactionException; }
public interface TransactionDefinition{ intgetPropagationBehavior(); // 返回事务的传播行为 int getIsolationLevel(); // 返回定义的事务的级别 int getTimeout(); // 返回定义的事务超时时间 boolean isReadOnly(); // 返回定义的事务是否是只读 String getName(); // 返回定义事务的名称 }
public interface TransactionStatusextends SavepointManager { boolean isNewTransaction(); boolean hasSavepoint(); void setRollbackOnly(); boolean isRollbackOnly(); void flush(); boolean isCompleted(); }
实现代码
package com.ztes.modules.test; import org.springframework.transaction.PlatformTransactionManager; public class SomeServiceImpl implements SomeService { private static PlatformTransactionManager transactionManager; public static PlatformTransactionManager getTransactionManager() { return transactionManager; } public static void setTransactionManager( PlatformTransactionManager transactionManager) { AgentServiceImpl.transactionManager = transactionManager; } //事务处理演示代码 public void save() { DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); TransactionStatus status = transactionManager.getTransaction(def); try { // 事务业务操作 } } catch (Exception e) { transactionManager.rollback(status);//回滚 e.printStackTrace(); } transactionManager.commit(status);//提交 } }
时间: 2024-10-23 22:24:42