`
Inmethetiger
  • 浏览: 111263 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring 事务一:非注解springmvc+注解or声明式事务

阅读更多

前两天一人问我,在使用spring mvc (基于注解) 的时候,事务失效(也是基于注解)。问我咋搞。好吧,我承认其实我一直只是在走马观花的看了一下spring的事务处理,因为我现在做的项目基本上只用到了查询,完全没有考虑事务回滚不回滚的问题。不过既然问到了,我就打算看一下。结果问题一大堆。所以,现在记下来,算是总结,也算是备忘。

编程式事务就不搞了。主要是搞声明式和注解式的事务。

由于我对spring事务是个新手。所以我做了几个小例子,一步一步的深入。

第一种:在非mvc中使用声明式事务。

 

package cn.lyy.model;

public class Teacher {

	private int id;
	private String name;
	private String email;

	
	
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

}

 

 

 

package cn.lyy.service;

import org.springframework.transaction.annotation.Transactional;

import cn.lyy.dao.TeacherDao;
import cn.lyy.model.Teacher;

public class TeacherService {

	private TeacherDao teacherDao;

	public void addTeacher(Teacher teacher) {
		teacherDao.insert(teacher);
		throw  new RuntimeException("运行异常"); //用来测试回滚
	}

	public TeacherDao getTeacherDao() {
		return teacherDao;
	}

	public void setTeacherDao(TeacherDao teacherDao) {
		this.teacherDao = teacherDao;
	}

}

 

 

package cn.lyy.dao;

import org.springframework.jdbc.core.JdbcTemplate;

import cn.lyy.model.Teacher;

public class TeacherDao {

	private JdbcTemplate jdbcTemplate;

	public void insert(Teacher teacher) {
		final String sql = "insert into teacher values(" + teacher.getId()
				+ ",'" + teacher.getName() + "','" + teacher.getEmail() + "')";
		jdbcTemplate.execute(sql);
	}

	public JdbcTemplate getJdbcTemplate() {
		return jdbcTemplate;
	}

	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}

}
 位于classpath下。

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-3.0.xsd">

	<context:property-placeholder location="classpath:jdbc.properties" />

	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close" p:driverClassName="${jdbc.driverClassName}"
		p:url="${jdbc.url}" p:username="${jdbc.username}" p:password="${jdbc.password}" />

	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
		p:dataSource-ref="dataSource" />


	<bean id="teacherDao" class="cn.lyy.dao.TeacherDao"
		p:jdbcTemplate-ref="jdbcTemplate" />

</beans>
  位于classpath下。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns="http://www.springframework.org/schema/beans"
	xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

	<import resource="classpath:applicationContext-dao.xml" />

	<bean id="teacherService" class="cn.lyy.service.TeacherService"
		p:teacherDao-ref="teacherDao" />

	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
		p:dataSource-ref="dataSource" />


	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="get*" read-only="true" />
			<tx:method name="add*" propagation="REQUIRED" isolation="READ_COMMITTED"
				rollback-for="java.lang.RuntimeException" />
			<tx:method name="update*" />
		</tx:attributes>
	</tx:advice>
	<aop:config>
		<aop:pointcut id="serviceMethod" expression="execution(* cn.lyy.service.*.*(..))" />
		<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod" />
	</aop:config>
</beans>

  位于classpath下。

#Mysql
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc\:mysql\://localhost\:3306/test
jdbc.username=root
jdbc.password=root

##oracle
#jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
#jdbc.url=jdbc:oracle:thin:@localhost:1521:ora9i
#jdbc.username=lyy
#jdbc.password=lyy

##sqlite
#jdbc.driverClassName=org.sqlite.JDBC
#jdbc.url=jdbc:sqlite:mydb.db
#jdbc.username=sa
#jdbc.password=

#postgre
jdbc.driverClassName=org.postgresql.Driver
jdbc.url=jdbc:postgresql:test
jdbc.username=lyy
jdbc.password=lyy
 测试:package cn.lyy.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.lyy.model.Teacher;
import cn.lyy.service.TeacherService;

public class TeacherTest {

	public static void main(String[] args) {
		
		
		String configLoaction = "classpath:applicationContext-tx.xml";
		ApplicationContext ctx = new ClassPathXmlApplicationContext(
				configLoaction);
		TeacherService teacherService = ctx.getBean(TeacherService.class);
	
		
		
		Teacher teacher = new Teacher();
		teacher.setId(2);
		teacher.setName("lyy2");
		teacher.setEmail("lyy@163.com");
		
		teacherService.addTeacher(teacher);
		
		

	}
}

 

   这是第一个,也是搭建最累的一个。主要是我选择的数据库是mysql。结果就是从控制台上看,事务确实回滚了。但是,再检查数据库,发现数据仍然插入,开始以为是事务的配置没有写好(对事务不熟),结果查了两天资料才无意中发现mysqlinnodb才支持事务。而且root权限下自动提交。于是换了sqlite数据库试了一下,发现可以成功回滚,最终确定用postgre数据库来做下面的实验。

 

第二种:注解式事务:因为只是实验。只要改以下两个地方,一是service类上加@Transactional.。然后在配置文件中。注释掉<tx:advice>的一大堆东西,改成

 

 <tx:annotation-driven transaction-manager="transactionManager"/>

 

 

就行了。

 

第二大类:非注解spring mvc + 声明式事务和 非注解springmvc+ 注解式事务

 

第三种:非注解spring mvc +声明式事务

这个和第一种差不多。不同之处是spring-servlet.xml中:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns="http://www.springframework.org/schema/beans"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">


	<bean id="handlerMapping"
		class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
	</bean>

	<bean name="/addteacher.do" class="cn.lyy.controller.TeacherController">

		<property name="teacherService" ref="teacherService">
		</property>
	</bean>
	
	
	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver"
		p:prefix="/WEB-INF/view/" p:suffix=".jsp" />


</beans>
 

 

 

第四种:非注解spring mvc + 注解事务

这个和第二种差不多。不同之处也是和上面一样。

 

下面的这个,也是spring使用得最多的一类

spring mvc(注解)+声明式事务。和spring mvc(注解)+注解式事务

1
0
分享到:
评论

相关推荐

    开源框架面试题系列:Spring+SpringMVC+MyBatis.zip

    - Spring事务管理:编程式事务和声明式事务的区别,@Transactional注解的使用。 - Spring Boot的自动配置原理及starter的机制。 2. **SpringMVC**: - 请求处理流程:从HTTP请求到响应的整个过程。 - ...

    开源框架面试题系列集:Spring+SpringMVC+MyBatis.zip

    4. **事务管理**:Spring支持编程式和声明式事务管理,理解两者的区别和应用场景。 5. **Spring Boot**:作为Spring的快速开发工具,面试中可能会问到自动配置、起步依赖、Actuator监控等特性。 MyBatis是一个优秀...

    开源框架面试题系列:Spring+SpringMVC+MyBatis.rar

    4. **事务管理**:了解Spring支持的编程式和声明式事务管理,以及如何配置事务规则。 5. **Spring Boot**:快速启动和简化配置的Spring应用框架,常用于微服务开发。 **SpringMVC框架** SpringMVC是Spring框架的一...

    开源框架面试题系列:Spring+SpringMVC+MyBatis-08.rar

    - **AOP(面向切面编程)**:提供声明式事务管理、日志记录等功能,允许开发者定义“切面”,在特定的JoinPoint上执行增强操作。 - **Bean管理**:Spring容器负责创建、配置、管理和初始化Bean。 - **IoC容器**:...

    springmvc+mybatis+spring注解

    4. **Spring事务管理**:Spring的@Transactional注解可以实现声明式事务管理,即在方法上添加此注解,Spring会自动进行事务的开启、提交、回滚等操作。这使得开发者无需手动管理事务,降低了出错的可能性,也使得...

    Spring+SpringMVC+Hibernate非注解版

    8. **事务管理**:Spring支持声明式事务管理,可以在Spring配置文件中开启事务管理,并在需要事务控制的Service层方法上添加@Transactional注解。 9. **Web配置**:配置SpringMVC的DispatcherServlet,设置视图解析...

    spring mvc + spring + hibernate 全注解整合开发视频教程 11

    在全注解开发中,我们可以使用@Autowired来自动装配bean,@Transactional来声明事务边界,@Service和@Repository则分别用于标记服务层和数据访问层的bean。 Hibernate是一个流行的Java ORM(对象关系映射)框架,它...

    spring+springmvc+mybatis完整包

    MyBatis与Spring框架结合使用时,可以实现声明式事务管理,简化了事务处理的代码。 这个压缩包中的“3.1.1jar”可能是Spring、SpringMVC和MyBatis的特定版本的库文件,这些库文件是集成这三个框架所必需的。确保...

    springmvc+mybatis+声明式事务管理

    声明式事务管理是Spring框架的一个强大特性,它使得开发者无需编写繁琐的事务控制代码,只需在配置文件或注解中声明事务边界。在SpringMVC+MyBatis的环境中,Spring能够自动管理事务的开始、提交、回滚等操作。例如...

    Spring+SpringMVC+SpringDataJPA+Hibernate

    在实际开发中,Spring Data JPA的Repository接口让开发者能够以声明式的方式执行查询,例如通过`findAll()`获取所有记录,或通过`findById()`根据ID查找特定记录。此外,还可以使用`@Query`注解自定义JPA查询语句。 ...

    spring+springMVC+Hibernate整合

    - **事务管理**:Spring提供了声明式事务管理,简化了事务的处理。 - **模型-视图-控制器**:SpringMVC的MVC设计模式清晰分离了业务逻辑、数据模型和用户界面。 - **ORM支持**:Hibernate使得Java对象与数据库表之间...

    SpringMVC+Spring+MyBatis整合完整版Web实例(附数据)

    3. **事务管理**:提供编程式和声明式事务管理,确保数据一致性。 4. **Spring MVC集成**:与SpringMVC无缝结合,提供统一的配置和上下文管理。 **MyBatis** MyBatis是一个轻量级的持久层框架,它解决了Java开发中...

    spring+springmvc+hibernate+thymeleaf 练习demo项目源码

    - **事务管理**:Spring和Hibernate结合,可以实现声明式事务管理,确保数据一致性。 4. Thymeleaf: - **模板语言**:在HTML中嵌入Thymeleaf语法,如`[[${var}]]`显示变量,`th:text`绑定属性值。 - **条件和...

    Spring+SpringMVC+Hibernate 框架整合

    此外,Spring还能接管Hibernate的事务管理,实现声明式事务,使得事务控制更加简洁。 具体整合步骤可能包括以下部分: 1. 配置Spring的ApplicationContext,定义Bean,包括DataSource、SessionFactory、Service层和...

    Spring+SpringMVC+MyBatis+Maven+easyUI整合代码 下载

    这是一个基于Java技术栈的Web应用开发整合包,主要包含了Spring、SpringMVC、MyBatis、Maven和easyUI这五个关键组件。下面将详细解释这些技术及其整合方式。 **Spring框架**:Spring是一个全面的Java企业级应用开发...

    Spring+SpringMVC+MyBatis(SSM)CRM 客户关系管理系统项目案例(可运行)

    Spring是Java领域的一个核心框架,它提供了一种声明式事务管理、依赖注入、AOP(面向切面编程)等功能,极大地简化了Java应用程序的开发。在本项目中,Spring主要负责以下任务: - **依赖注入(Dependency Injection...

    Spring+Hibernate+SpringMVC+Maven整合

    通过Spring的声明式事务管理,可以简化事务控制,减少代码中的错误。而Maven则保证了项目的构建一致性,方便进行版本管理和构建自动化。 总结来说,"Spring+Hibernate+SpringMVC+Maven整合"是现代Java Web开发中的...

    SpringMVC+Spring+Mybatis集成开发环境

    Mybatis与Spring框架结合使用时,可以实现声明式事务管理,进一步提升开发效率。 将SpringMVC、Spring和Mybatis集成在一起,首先需要配置Spring的上下文,声明Bean并管理其生命周期。然后,通过Spring的DataSource...

    SpringMVC+Spring+Hibernate(SSH)框架搭建之一

    4. 事务管理:启用Spring的声明式事务管理,通过@Transactional注解控制事务边界。 5. AOP配置:如果需要,可以配置AOP规则,如定义切面、通知类型等。 最后,我们将整合Hibernate作为ORM(对象关系映射)工具,它...

Global site tag (gtag.js) - Google Analytics