`
harborgang
  • 浏览: 17108 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

spring事务example Test

阅读更多
package com.vxichina.test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;

/***
 * 
 * @author harbor
 *
 */
public class JDBCTemplateTransactionTest {
	public static final String CREATE_TABLE_SQL = "create table transactionTestTable (id int    IDENTITY PRIMARY KEY, name varchar(100))";
	public static final String DROP_TABLE_SQL = "drop table transactionTestTable";
	public static final String INSERT_SQL = "insert into transactionTestTable(name) values(?)";
	public static final String COUNT_SQL = "select count(*) from transactionTestTable";

	public static void main(String[] args) {
		/*
		 * 
		 * 事务必需满足ACID(原子性、一致性、隔离性和持久性)特性,缺一不可:

		    原子性(Atomicity):即事务是不可分割的最小工作单元,事务内的操作要么全做,要么全不做;
		    一致性(Consistency):在事务执行前数据库的数据处于正确的状态,而事务执行完成后数据库的数据还是处于正确的状态,即数据完整性约束没有被破坏;如银行转帐,A转帐给B,必须保证A的钱一定转给B,一定不会出现A的钱转了但B没收到,否则数据库的数据就处于不一致(不正确)的状态。
		    隔离性(Isolation):并发事务执行之间无影响,在一个事务内部的操作对其他事务是不产生影响,这需要事务隔离级别来指定隔离性;
		    持久性(Durability):事务一旦执行成功,它对数据库的数据的改变必须是永久的,不会因比如遇到系统故障或断电造成数据不一致或丢失。
		
		   在实际项目开发中数据库操作一般都是并发执行的,即有多个事务并发执行,并发执行就可能遇到问题,目前常见的问题如下:
		
		    丢失更新:两个事务同时更新一行数据,最后一个事务的更新会覆盖掉第一个事务的更新,从而导致第一个事务更新的数据丢失,这是由于没有加锁造成的;
		    脏读:一个事务看到了另一个事务未提交的更新数据;
		    不可重复读:在同一事务中,多次读取同一数据却返回不同的结果;也就是有其他事务更改了这些数据;
		    幻读:一个事务在执行过程中读取到了另一个事务已提交的插入数据;即在第一个事务开始时读取到一批数据,但此后另一个事务又插入了新数据并提交,此时第一个事务又读取这批数据但发现多了一条,即好像发生幻觉一样。

		    未提交读(Read Uncommitted):最低隔离级别,一个事务能读取到别的事务未提交的更新数据,很不安全,可能出现丢失更新、脏读、不可重复读、幻读;
		    提交读(Read Committed):一个事务能读取到别的事务提交的更新数据,不能看到未提交的更新数据,不可能可能出现丢失更新、脏读,但可能出现不可重复读、幻读;
		    可重复读(Repeatable Read):保证同一事务中先后执行的多次查询将返回同一结果,不受其他事务影响,可能可能出现丢失更新、脏读、不可重复读,但可能出现幻读;
		    序列化(Serializable):最高隔离级别,不允许事务并发执行,而必须串行化执行,最安全,不可能出现更新、脏读、不可重复读、幻读。
		
		    隔离级别越高,数据库事务并发执行性能越差,能处理的操作越少。因此在实际项目开发中为了考虑并发性能一般使用提交读隔离级别,它能避免丢失更新和脏读,
		  尽管不可重复读和幻读不能避免,但可以在可能出现的场合使用悲观锁或乐观锁来解决这些问题。
		  
		Spring中Propagation类的事务属性详解:
	    PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 
	    PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。 
	    PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。 
	    PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
	    PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 
	    PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。 
	    PROPAGATION_NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。
    <tx:advice id="txAdvice" transaction-manager="txManager">  
    <tx:attributes>  
               <tx:method name="save*" propagation="REQUIRED" />  
               <tx:method name="add*" propagation="REQUIRED" />  
               <tx:method name="create*" propagation="REQUIRED" />  
               <tx:method name="insert*" propagation="REQUIRED" />  
               <tx:method name="update*" propagation="REQUIRED" />  
               <tx:method name="merge*" propagation="REQUIRED" />  
               <tx:method name="del*" propagation="REQUIRED" />  
               <tx:method name="remove*" propagation="REQUIRED" />  
               <tx:method name="put*" propagation="REQUIRED" />  
               <tx:method name="get*" propagation="SUPPORTS" read-only="true" />  
               <tx:method name="count*" propagation="SUPPORTS" read-only="true" />  
              <tx:method name="find*" propagation="SUPPORTS" read-only="true" />  
              <tx:method name="list*" propagation="SUPPORTS" read-only="true" />  
              <tx:method name="*" propagation="SUPPORTS" read-only="true" />  
           </tx:attributes>  
    </tx:advice>  
    <aop:config>  
           <aop:pointcut id="txPointcut" expression="execution(* cn.javass..service.*.*(..))" />  
           <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" />  
    </aop:config>  
		 */
		DefaultTransactionDefinition def = new DefaultTransactionDefinition();      
		def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);     
		def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);  
		Properties ps = new Properties();
		ps.setProperty("driverClassName", "net.sourceforge.jtds.jdbc.Driver");
		ps.setProperty("driverClassName","net.sourceforge.jtds.jdbc.Driver" );
        ps.setProperty("url","jdbc:jtds:sqlserver://localhost:1433/vxi_def" );
        ps.setProperty("username","username" );
		ps.setProperty("password","passwrod" );
		ps.setProperty("maxActive","5" );
		ps.setProperty("maxIdle","3" );
		ps.setProperty("maxWait","1000" );
		ps.setProperty("defaultAutoCommit","true" );
		ps.setProperty("removeAbandoned","true" );
		ps.setProperty("removeAbandonedTimeout","60" );
		
		DataSource dataSource = null;
		DataSourceTransactionManager txManager = new DataSourceTransactionManager();
		  
		Connection conn = null;
		TransactionStatus status = null;
		try {
			dataSource = BasicDataSourceFactory.createDataSource(ps);
			txManager.setDataSource(dataSource);
			status = txManager.getTransaction(def);
			conn = DataSourceUtils.getConnection(dataSource);
			conn.prepareStatement(CREATE_TABLE_SQL).execute();
			PreparedStatement pstmt = conn.prepareStatement(INSERT_SQL);
			pstmt.setString(1, "test");
			pstmt.execute();
			// conn.prepareStatement(DROP_TABLE_SQL).execute();
			// txManager.commit(status);
		} catch (Exception e) {
			e.printStackTrace();
			status.setRollbackOnly();
			txManager.rollback(status);
		} finally {
			DataSourceUtils.releaseConnection(conn, dataSource);
		}
	}

}
分享到:
评论

相关推荐

    spring example

    8. SpringExample11.zip:可能涉及Spring Test和Mockito的示例,展示了如何编写单元测试和集成测试,确保代码质量。 9. SpringExample21.zip:可能包含Spring Batch的示例,这是一个处理批量操作的强大框架,适用于...

    spring-data-jpa-example

    这个名为 "spring-data-jpa-example" 的项目是一个面向初学者的示例,旨在帮助理解并掌握 Spring Data JPA 的基本用法。 1. **Spring Data JPA 概述** - Spring Data JPA 是 Spring Framework 的一个模块,它简化...

    SpringTest

    首先,Spring是一个开源的Java企业级应用框架,它提供了丰富的功能,如AOP(面向切面编程)、DI(依赖注入)、事务管理、数据访问/集成等。在本案例中,我们主要关注的是依赖注入,它是Spring的核心特性之一。 1. *...

    4.Spring中的JdbcTemplate,Spring中的的事务,

    #### Spring事务控制的基础概念 Spring框架支持两种类型的事务管理:编程式事务管理和声明式事务管理。 - **编程式事务管理**:通过编码的方式来管理事务,适用于需要细粒度控制的情况。 - **声明式事务管理**:...

    spring-example-db-tx:数据库事务的Spring示例

    《Spring数据库事务管理详解——基于spring-example-db-tx示例》 在软件开发中,数据库事务是确保数据一致性、完整性和可靠性的关键机制。本文将以"spring-example-db-tx"项目为例,深入探讨如何在Java环境中,特别...

    activiti-api-spring-integration-example.zip

    本示例项目"activityexample"便是将Activiti API与Spring进行集成的一个实例,通过解压缩文件"activiti-api-spring-integration-example.zip",我们可以深入学习如何在Spring环境中运用Activiti。 首先,让我们理解...

    spring学习笔记(十六)-声明式事务的例子

    对于“test_hebenate_2”这个文件名,可能指的是测试Hibernate(一个流行的ORM框架)与Spring集成时的事务管理例子。在这样的场景下,通常会结合Spring的声明式事务管理与Hibernate的Session进行交互,确保数据操作...

    spring_example01

    3. **面向切面编程(Aspect-Oriented Programming, AOP)**:Spring支持AOP,使得开发者可以定义横切关注点,如日志记录、事务管理等,这些关注点可以跨多个对象(切点)应用,从而实现代码解耦。 4. **Spring Boot...

    JSF 2 + Spring 3 integration example

    JavaServer Faces (JSF) 是一个用于构建 Web 应用程序的 Java EE 框架,它专注于视图层的构建,而 Spring 框架则是一个全面的后端开发框架,包括依赖注入、事务管理、AOP(面向切面编程)等功能。将 JSF 与 Spring ...

    Spring-Example:这是Spring框架的例子

    通过查看这些文件,我们可以了解到Spring项目的一般组织结构,如src/main/java目录下的源码,src/test/java下的测试代码,以及可能存在的application.properties或application.yml配置文件。 这个"Spring-Example...

    selenium-spring-example:将 Spring 与 Selenium 结合使用的示例

    1. **Spring 框架**:Spring 是一个全面的企业级应用开发框架,提供了依赖注入、AOP(面向切面编程)、事务管理等功能。在这里,它被用来管理测试对象的生命周期,包括 Selenium WebDriver 实例。 2. **Selenium ...

    MyBatis与Spring整合——通过官方文档进行最简单的整合

    import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest public class IntegrationTest { @Autowired private EmployeeService employeeService; @Test public void ...

    Spring2.0学习手册

    8. **单元测试支持**:Spring Test模块提供了测试支持,包括Mock对象和ApplicationContext加载,使得测试Spring应用变得简单。 9. **事务管理**:Spring提供了声明式和编程式的事务管理,使得事务处理可以在不侵入...

    spring aop ioc实例

    最后,`springTest`这个文件可能是包含了运行Spring AOP和IOC示例的项目。这个项目可能包含了Spring配置文件、Java源代码以及必要的依赖库。为了运行这个示例,你需要设置一个Spring容器,加载配置,然后从容器中...

    Spring学习笔记(15)----使用Spring的注解方式实现AOP

    在本篇Spring学习笔记中,我们将深入探讨如何利用Spring框架的注解方式来实现面向切面编程(AOP)。AOP是一种编程范式,它允许我们定义横切关注点,如日志、事务管理等,然后将这些关注点模块化并插入到应用程序的多...

    spring容器简单实例

    在提供的`springtest`压缩包中,可能包含了相关的代码示例,你可以通过解压并运行这些代码,加深对Spring容器的理解。实践中,尝试修改配置,观察不同配置对bean的影响,这将有助于你更好地掌握Spring的核心概念。

    spring_example

    - Spring 提供了测试支持,包括 `@RunWith(SpringRunner.class)` 和 `@SpringBootTest` 注解,便于进行单元测试和集成测试。 11. **Maven 或 Gradle** - 项目管理工具,如 Maven 或 Gradle,可能被用来管理依赖、...

    初识Spring

    7. **单元测试和集成测试**:Spring支持JUnit进行单元测试,使用Mockito模拟对象,以及Spring Test和Spring Boot Test进行集成测试,确保代码质量。 8. **WebContent目录**:在传统的Java Web项目中,`WebContent`...

    spring使用实例demo

    在这个"Springtest"压缩包中,我们可以找到这样的配置文件,它包含了bean的定义、属性注入、装配关系等信息。 bean的定义是XML配置的核心,例如: ```xml &lt;bean id="exampleBean" class="com.example.ExampleBean...

    spring整合mybatis.docx

    在描述中给出的项目架构中,可以看到引入了Spring的核心模块(如`spring-context`、`spring-aspects`、`spring-orm`和`spring-test`),MyBatis 和 MyBatis-Spring 框架,以及测试、日志、数据库驱动等其他依赖。...

Global site tag (gtag.js) - Google Analytics