Spring - 事务处理

关于事务处理

事务为了保证数据的一致性和完整性,保证整个操作的原子性。



编程式事务

需要在代码中直接加入事务的逻辑,可能需要在代码中显式的调用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

Spring - 事务处理的相关文章

spring事务处理详解

1:Java包含两种异常:checked异常和unchecked异常. checked和unchecked异常之间的区别是: Checked异常必须被显式地捕获try-catch-finally,而unchecked异常则可以不必捕获或抛出. Checked异常继承java.lang.Exception类.Unchecked异常继承自java.lang.RuntimeException类. 2:Mysql 存储引擎中InnoDB与Myisam的主要区别 事务处理方面:innodb 支持事务功能,

Spring事务处理流程和原理

一.事务理论学习 利用数据库事务实现应用事务控制 1.要求:同一个事务需要同一个库的同一个连接. 2.  3.分布式事务 JTA  二.spring事务处理建模 1. 2. 三.spring事务处理流程 1. 2. 3. 原文地址:https://www.cnblogs.com/wenxiangchen/p/11444098.html

Springmvc + mybatis + spring 配置 spring事务处理

今天配置了半天,发现,事物不起效果,主要出现如下错误: org.mybatis.spring.transaction.SpringManagedTransaction] - [JDBC Connection [[email protected]] will not be managed by Spring SqlSession [[email protected]] was not registered for synchronization because synchronization is

(转)Spring事务处理时自我调用的解决方案及一些实现方式的风险

转:http://www.iteye.com/topic/1122740 预备知识 测试代码准备 问题 解决方案 1通过ThreadLocal暴露Aop代理对象 2通过初始化方法在目标对象中注入代理对象 3通过BeanPostProcessor 在目标对象中注入代理对象 4改进版的InjectBeanSelfProcessor的解决方案 总结 前些日子一朋友在需要在目标对象中进行自我调用,且需要实施相应的事务定义,且网上的一种通过BeanPostProcessor的解决方案是存在问题的.因此专门

Spring事务处理

主要是两个方面: 一是开始事务 conn.setAutoCommit(false);默认是true 二是提交事务 conn.commit(); 一.创建一个类 连接数据库的方法封装在Util包中,获取Connection连接.该类的功能是通过id修改表t_emp 中对应id的acount的值. 使用Connection的preparestatement方法. public class AcountDao { public void update(Connection conn,Integer i

Spring源码阅读:Spring声明式事务处理和编程式事务处理的设计与实现

之前的学习,了解了Spring事务管理的基础框架(查看).Spring在此基础上又提到了声明式事务管理和编程式事务管理.这里就来看看Spring是如何实现的. Spring声明式事务与EJB事务管理对比 Spring的声明式管理,类似于EJB的CMT,但又有不同.他们的不同之处有: 1)EJB的CMT是与JTA结合使用,而Spring框架的声明式事务管理可以在任何环境下工作.既可以使用全局事务管理,如JTA,也可以使用局部事务管理如JDBCJPA.Hibernate.JDO等. 2)可以在任何类

spring(15)------spring的事务处理

一,了解事务处理 1.1 基本概念 事务处理在运用程序中起着至关重要的作用,事务处理由若干个步骤组成,这些步骤间有着各种各样的逻辑关系, 一个事务中的所有步骤必须同时成功或失败.当所有步骤操作成功时,事务算完成,而当某个事务操作失败, 所有的步骤都需要回滚.对于提交和回滚的概念说明: 提交(commit):当所有的步骤被完整执行完成时,称该事务被提交. 回滚(rollback):当某个步骤操作异常时,所有的步骤都不能被提交,必须进行回滚,回滚到执行前的状态. 1.2事务处理的特征 原子性(Ato

事务处理: databse jdbc mybatis spring

事务的认识需要一个相当漫长的流程,慢慢在实践中理解,然后在强化相关理论基础. 数据库中的事务: 传统的本地事务处理都是依靠数据库自身事务处理能力,而事务本身是传统关系型数据库的基石.简单来说事务就是一些满足acid特性的sql,数据库通过锁和日志实现这些机制.国内的mysql中innodb事务引擎引料众多,也有很多文章让我们深刻理解索引和事务的概念.此处简单说一下我的理解: A:代表原子性,最好理解,要么全做,要么全不做. C:一致性,简单来说就是你扣了50,有人就加了50(一致性本身存在好多种

Spring事务异常回滚,捕获异常不抛出就不会回滚(转载) 解决了我一年前的问题

最近遇到了事务不回滚的情况,我还考虑说JPA的事务有bug? 我想多了.......    为了打印清楚日志,很多方法我都加tyr catch,在catch中打印日志.但是这边情况来了,当这个方法异常时候 日志是打印了,但是加的事务却没有回滚. 例:     类似这样的方法不会回滚 (一个方法出错,另一个方法不会回滚) : if(userSave){ try { userDao.save(user); userCapabilityQuotaDao.save(capabilityQuota); }