`
glacier3
  • 浏览: 386192 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

自动支持事务的类

阅读更多

自动支持事务的类

package aaa;

import java.util.Properties;

import org.springframework.aop.framework.ProxyFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor;
import org.springframework.transaction.interceptor.TransactionInterceptor;
import org.springframework.util.Assert;

/**
 * <p>解析JDBC事务配置</p> 
 *<meta key="tx" value="save*:PROPAGATION_REQUIRED; "/>
 *<table border="1" width="788">
  <tbody>
    <tr>
      <td width="274" align="center">隔离等级</td>
      <td width="399" align="center">描述</td>
    </tr>
    <tr>
      <td>ISOLATION_DEFAULT</td>
      <td align="center">默认隔离等级<br />
      </td>
    </tr>
    <tr>
      <td>ISOLATION_READ_UNCOMMITTED<br />
      </td>
      <td>最低隔离等级,仅仅保证了读取过程中不会读取到非法数据</td>
    </tr>
    <tr>
      <td>ISOLATION_READ_COMMITTED<br />
      </td>
      <td>某些数据库的默认隔离等级;保证了一个事务不会读到另外一个并行事务已修改但未提交的数据</td>
    </tr>
    <tr>
      <td>ISOLATION_REPEATABLE_READ<br />
      </td>
      <td>比上一个更加严格的隔离等级。保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据</td>
    </tr>
    <tr>
      <td>ISOLATION_SERIALIZABLE</td>
      <td>性能代价最为昂贵,最可靠的隔离等级。所有事务都严格隔离,可视为各事务顺序执行</td>
    </tr>
  </tbody>
</table>
<p> </p>
<p align="left">传播途径(Propagation Behavior)</p>
<p> </p>
<table border="1" width="791">
  <tbody>
    <tr>
      <td width="253" align="center">Propagation Behavior<br />
      </td>
      <td width="522" align="center">描述<br />
      </td>
    </tr>
    <tr>
      <td>PROPAGATION_REQUIRED </td>
      <td>支持现有事务。如果没有则创建一个事务</td>
    </tr>
    <tr>
      <td> PROPAGATION_SUPPORTS </td>
      <td>支持现有事务。如果没有则以非事务状态运行。</td>
    </tr>
    <tr>
      <td> PROPAGATION_MANDATORY </td>
      <td>支持现有事务。如果没有则抛出异常。</td>
    </tr>
    <tr>
      <td> PROPAGATION_REQUIRES_NEW </td>
      <td>总是发起一个新事务。如果当前已存在一个事务,则将其挂起。</td>
    </tr>
    <tr>
      <td>PROPAGATION_NOT_SUPPORTED </td>
      <td>不支持事务,总是以非事务状态运行,如果当前存在一个事务,则将其挂起。</td>
    </tr>
    <tr>
      <td> PROPAGATION_NEVER </td>
      <td> 不支持事务,总是以非事务状态运行,如果当前存在一个事务,则抛出异常。</td>
    </tr>
    <tr>
      <td> PROPAGATION_NESTED </td>
      <td>如果当前已经存在一个事务,则以嵌套事务的方式运行,如果当前没有事务,则以默认方式(第一个)执行</td>
    </tr>
  </tbody>
</table>
 *
 */
public class TransactionManager implements BeanPostProcessor,
		BeanFactoryPostProcessor {

	private ConfigurableListableBeanFactory beanFactory;
	private DataSourceTransactionManager transactionManager;
	private static final String META_TRANSACTION_METHODS_NAME = "tx";

	public Object postProcessAfterInitialization(Object bean, String beanName)
			throws BeansException {
		if (beanFactory.containsBean(beanName)) {
			BeanDefinition beanDefinition = beanFactory
					.getBeanDefinition(beanName);

			String transactionAttributeValue = beanDefinition
					.getAttribute(META_TRANSACTION_METHODS_NAME) != null ? beanDefinition
					.getAttribute(META_TRANSACTION_METHODS_NAME).toString()
					: null;
			if (transactionAttributeValue == null) {
				return bean;
			}
			Assert.hasText(transactionAttributeValue,
					"if 'tx' meta is setted , 'tx' meta can't be empty! [ bean id:"
							+ beanName + "]");

			TransactionInterceptor transactionInterceptor = new TransactionInterceptor();
			transactionInterceptor.setTransactionManager(transactionManager);

			Properties transactionAttributes = new Properties();
			
			parseAttributes(transactionAttributes,transactionAttributeValue);

			transactionInterceptor
					.setTransactionAttributes(transactionAttributes);

			TransactionAttributeSourceAdvisor advisor = new TransactionAttributeSourceAdvisor(
					transactionInterceptor);

			ProxyFactory proxyFactory = new ProxyFactory();
			proxyFactory.addAdvisor(advisor);
			proxyFactory.setTarget(beanFactory.getBean(beanName));

			return proxyFactory.getProxy();
		}
		return bean;
	}

	private void parseAttributes(Properties transactionAttributes, String transactionAttributeValue) {
		String[] split = transactionAttributeValue.split(";");
		
		for (int i = 0; i < split.length; i++) {
			String[] splitcolon = split[i].split(":");

			if (splitcolon.length < 2) {
				break;
			}
			
			Assert.hasText(splitcolon[0]," can't  filled with empty string ");
			Assert.hasText(splitcolon[1]," can't  filled with empty string ");

			transactionAttributes.setProperty(splitcolon[0], splitcolon[1]);
		}
	}

	public Object postProcessBeforeInitialization(Object bean, String beanName)
			throws BeansException {
		return bean;
	}

	public void postProcessBeanFactory(
			ConfigurableListableBeanFactory beanFactory) throws BeansException {
		this.beanFactory = beanFactory;
	}

	public void setTransactionManager(
			DataSourceTransactionManager transactionManager) {
		this.transactionManager = transactionManager;
	}

}

分享到:
评论

相关推荐

    JavaEE spring半自动bean管理事务案例

    在提供的`Day01_Tx`文件中,可能包含了一些示例代码,如配置文件、服务层代码或数据库操作类,用于展示Spring如何实现半自动bean管理和事务控制。通过分析这些代码,你可以更深入地理解这两个概念,并将它们应用到...

    java事务管理和事务分类

    **JDBC事务**:这是最基本的事务管理方式,通过`Connection`对象的`setAutoCommit()`来开启或关闭自动提交,`commit()`和`rollback()`用于提交或回滚事务。JDBC事务局限于单个数据库连接,无法处理跨数据库的事务。 ...

    在SSH框架中加入事务支持

    在加入事务支持的过程中,Struts并不直接参与事务管理,但可以通过Action类的Service注入来调用Spring管理的事务方法。 总结来说,SSH框架中的事务支持主要由Spring提供,通过声明式或编程式的方式实现。Spring 2.0...

    C#中增加SQLite事务操作支持与使用方法

    C# 中增加 SQLite 事务操作支持与使用方法 在 C# 中使用 SQLite 数据库时,事务操作是非常重要的一部分。事务操作可以确保数据库的数据一致性和完整性,避免数据不一致的情况。下面将详细介绍 C# 中增加 SQLite ...

    C#(.net)分布式事务处理类及事件使用

    在.NET框架中,主要通过System.Transactions命名空间下的类来支持分布式事务。以下是一些关键类的简要介绍: 1. **TransactionScope**: 这是.NET中处理分布式事务的核心类。当你创建一个TransactionScope实例时,它...

    Spring 事务开发代码文件

    默认情况下,如果在事务中抛出未检查异常(继承自`RuntimeException`)或`Error`,Spring会自动回滚事务。而检查异常(继承自`Exception`)则不会导致回滚,除非在`@Transactional`中显式指定。 4. **事务的ACID...

    SpringBoot事务和Spring事务详讲

    例如,通过在方法上使用 `@Transactional` 注解,可以轻松地将事务管理应用于特定的方法或类。 #### 六、注意事项 虽然 Spring 和 Spring Boot 提供了强大的事务管理支持,但在实际开发中还需要注意以下几点: - *...

    基于.NET的事务处理

    .NET框架提供了强大的事务处理功能,支持手动事务和自动事务两种方式。 #### 六、.NET中的手动事务处理 手动事务处理是指程序员需要显式地管理事务的生命周期,包括事务的启动、提交或回滚等操作。 1. **ADO.NET...

    asp.net 事务处理

    3. **事务管理级别**:ASP.NET支持三种事务管理级别:无事务、自动事务和显式事务。无事务是最简单的形式,不保证事务特性。自动事务会在每个SQL命令后自动提交,而显式事务则允许开发者手动控制事务的开始、提交和...

    spring事物 支持

    开发者可以使用`PlatformTransactionManager`接口及其实现类(如`DataSourceTransactionManager`)来显式地开始、提交、回滚事务。例如,通过`TransactionTemplate`或者直接使用`TransactionStatus`接口来管理事务的...

    spring事务与数据库操作

    5. **开启AOP注解自动代理**:通过`&lt;aop:aspectj-autoproxy/&gt;`启用AspectJ注解的支持。 6. **编写切面类**:定义一个切面类,并使用`@Aspect`注解标注。 7. **定义切入点和通知**:使用`@Pointcut`定义切入点,使用`...

    Spring事务流程图

    若出现异常,Spring会自动回滚事务,以保证数据的一致性。 4. **事务隔离**:Spring支持多种事务隔离级别,如READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE,不同的隔离级别能防止特定类型的...

    Spring事务传播特性解析

    方法被调用时自动开启事务,在事务范围内使用则使用同一个事务,否则开启新事务。 2、Propagation.REQUIRES_NEW 无论何时自身都会开启事务 3、Propagation.SUPPORTS 自身不会开启事务,在事务范围内则...

    浅谈SpringBoot之事务处理机制

    浅谈SpringBoot之事务处理机制 ...它提供了统一的机制来处理不同数据访问技术的事务处理,并支持声明式事务和类级别的事务支持。同时,Spring Boot也为我们提供了自动配置的事务管理器,方便我们使用事务机制。

    Spring事务原理、Spring事务配置的五种方式

    围绕Poxy的动态代理能够自动的提交和回滚事务。 PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务...

    .net5种事务机制详细介绍

    MSMQ 支持事务性消息传递,允许在消息队列中发送和接收消息时使用事务。`.NET` 提供 `System.Messaging` 命名空间来进行事务性消息处理。当消息队列操作失败时,事务可以回滚,确保消息不会丢失。 4. **Enterprise...

    springboot整合spring事务

    8. **事务嵌套**:Spring支持事务嵌套,当一个事务方法被另一个事务方法调用时,Spring会创建一个子事务,子事务的提交或回滚不影响父事务。 9. **事务隔离级别**:包括`READ_UNCOMMITTED`、`READ_COMMITTED`、`...

    spring-tx事务管理实例

    在XML配置文件中,我们可以使用`&lt;tx:annotation-driven&gt;`元素开启基于注解的事务管理,或者在Java配置类中使用`@EnableTransactionManagement`注解。然后,在需要事务管理的方法上添加`@Transactional`注解,Spring...

    数据库事务应用

    - **自动化事务处理(如COM+)**:在.NET框架下,可以向类中添加属性以声明事务处理需求。这种模型简化了分布式事务的配置和管理,特别适用于涉及多个组件和资源管理器的复杂系统。 #### 选择事务处理模型 在决定...

Global site tag (gtag.js) - Google Analytics