Spring 编程事物管理

文前:网站里文章的字体给人的感觉真心不爽! 正文: 除了Spring的DIST下的包外,加入: Java代码: commons-pool.jar  commons-dbcp.jar  mysql-connector-java-5.1.5-bin.jar  我这里使...

文前:网站里文章的字体给人的感觉真心不爽!

正文:

除了Spring的DIST下的包外,加入:

Java代码:

  1. commons-pool.jar  
  2. commons-dbcp.jar  
  3. mysql-connector-java-5.1.5-bin.jar 


这里使用的是mysql数据库,在test库内创建表:

Java代码:

  1. DROP TABLE IF EXISTS `user`;  
  2. CREATE TABLE `user` (  
  3.   `id` int(11) NOT NULL AUTO_INCREMENT,  
  4.   `age` int(11) DEFAULT NULL,  
  5.   `name` varchar(255) DEFAULT NULL,  
  6.   PRIMARY KEY (`id`)  
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;  


编程式事物相对声明式事物有些繁琐,但是还是有其独到的优点。编程式的事物管理可以清楚的控制事务的边界,自行控制事物开始、撤销、超时、结束等,自由控制事物的颗粒度。
借用Spring MVC 入门示例 Spring MVC入门小样 的代码。这里直接在Action层直接做代码示例,并使用注解进行属性注入:

首先编辑applicationContext.xml,配置数据库连接属性:

Java代码:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.        xmlns:mvc="http://www.springframework.org/schema/mvc"  
  5.        xmlns:p="http://www.springframework.org/schema/p"  
  6.        xmlns:context="http://www.springframework.org/schema/context"  
  7.        xmlns:aop="http://www.springframework.org/schema/aop"  
  8.        xmlns:tx="http://www.springframework.org/schema/tx"  
  9.        xsi:schemaLocation="http://www.springframework.org/schema/beans  
  10.             http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  11.             http://www.springframework.org/schema/context   
  12.             http://www.springframework.org/schema/context/spring-context-3.0.xsd  
  13.             http://www.springframework.org/schema/aop   
  14.             http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
  15.             http://www.springframework.org/schema/tx   
  16.             http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
  17.             http://www.springframework.org/schema/mvc   
  18.             http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd  
  19.             http://www.springframework.org/schema/context   
  20.             http://www.springframework.org/schema/context/spring-context-3.0.xsd">  
  21.     <!-- 数据源 -->  
  22.     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">  
  23.         <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
  24.         <property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8" />  
  25.         <property name="username" value="root" />  
  26.         <property name="password" value="root" />  
  27.     </bean>  
  28. </beans>  


Spring提供两种实现方式,使用PlatformTransactionManager或TransactionTemplate。
以下示例使用PlatformTransactionManager的实现类DataSourceTransactionManager来完成。

Java代码:

  1. package test;  
  2. import java.util.Date;  
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.http.HttpServletResponse;  
  5. import javax.sql.DataSource;  
  6. import org.springframework.beans.factory.annotation.Autowired;  
  7. import org.springframework.jdbc.core.JdbcTemplate;  
  8. import org.springframework.jdbc.datasource.DataSourceTransactionManager;  
  9. import org.springframework.transaction.TransactionStatus;  
  10. import org.springframework.transaction.support.DefaultTransactionDefinition;  
  11. import org.springframework.web.bind.annotation.RequestMapping;  
  12. // http://localhost:8080/spring/hello.do?user=java  
  13. @org.springframework.stereotype.Controller  
  14. public class HelloController{  
  15.     private DataSourceTransactionManager transactionManager;  
  16.     private DefaultTransactionDefinition def;  
  17.     private JdbcTemplate jdbcTemplate;  
  18.     @SuppressWarnings("unused")  
  19.     // 使用注解注入属性  
  20.     @Autowired  
  21.     private void setDataSource(DataSource dataSource){  
  22.         jdbcTemplate = new JdbcTemplate(dataSource);  
  23.         transactionManager = new DataSourceTransactionManager(dataSource);  
  24.         // 事物定义  
  25.         def = new DefaultTransactionDefinition();  
  26.         // 事物传播特性  
  27.         def.setPropagationBehavior(DefaultTransactionDefinition.PROPAGATION_REQUIRED);  
  28. //      def.setReadOnly(true); // 指定后会做一些优化操作,但是必须搭配传播特性,例如:PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW,PROPAGATION_NESTED  
  29. //      def.setTimeout(1000); // 合理的超时时间,有助于系统更加有效率  
  30.     }  
  31.     @SuppressWarnings("deprecation")  
  32.     @RequestMapping("/hello.do")  
  33.     public String hello(HttpServletRequest request,HttpServletResponse response){  
  34.         request.setAttribute("user", request.getParameter("user") + "-->" + new Date().toLocaleString());  
  35.         TransactionStatus status = transactionManager.getTransaction(def);  
  36.         try {  
  37.             jdbcTemplate.update(" update user set age=age+1; ");  
  38.             // 发生异常  
  39.             jdbcTemplate.update(" update user set age='test'; ");  
  40.             transactionManager.commit(status);  
  41.         } catch (Exception e) {  
  42.             transactionManager.rollback(status);  
  43.         }  
  44.         return "hello";  
  45.     }  
  46. }  


也可以使用TransactionTemplate来实现,它需要一个TransactionManager实例,代码如下:

  1. package test;  
  2. import java.util.Date;  
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.http.HttpServletResponse;  
  5. import javax.sql.DataSource;  
  6. import org.springframework.beans.factory.annotation.Autowired;  
  7. import org.springframework.jdbc.core.JdbcTemplate;  
  8. import org.springframework.jdbc.datasource.DataSourceTransactionManager;  
  9. import org.springframework.transaction.TransactionStatus;  
  10. import org.springframework.transaction.support.DefaultTransactionDefinition;  
  11. import org.springframework.transaction.support.TransactionCallback;  
  12. import org.springframework.transaction.support.TransactionTemplate;  
  13. import org.springframework.web.bind.annotation.RequestMapping;  
  14. @org.springframework.stereotype.Controller  
  15. public class HelloController{  
  16.     private DataSourceTransactionManager transactionManager;  
  17.     private DefaultTransactionDefinition def;  
  18.     private JdbcTemplate jdbcTemplate;  
  19.     @SuppressWarnings("unused")  
  20.     @Autowired  
  21.     private void setDataSource(DataSource dataSource){  
  22.         jdbcTemplate = new JdbcTemplate(dataSource);  
  23.         transactionManager = new DataSourceTransactionManager(dataSource);  
  24.         def = new DefaultTransactionDefinition();  
  25.         def.setPropagationBehavior(DefaultTransactionDefinition.PROPAGATION_REQUIRED);  
  26.     }  
  27.     @SuppressWarnings({ "deprecation""unchecked" })  
  28.     @RequestMapping("/hello.do")  
  29.     public String hello(HttpServletRequest request,HttpServletResponse response){  
  30.         request.setAttribute("user", request.getParameter("user") + "-->" + new Date().toLocaleString());  
  31.         TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);  
  32.         Object obj = null;  
  33.         try {  
  34.             // 不需要返回值使用TransactionCallbackWithoutResultback  
  35.             obj = transactionTemplate.execute(new TransactionCallback(){  
  36.                 public Object doInTransaction(TransactionStatus arg0) {  
  37.                     jdbcTemplate.update(" update user set age=age+1; ");  
  38.                     // 发生异常  
  39.                     jdbcTemplate.update(" update user set age='test'; ");  
  40.                     return 1;  
  41.                 }  
  42.             });  
  43.         } catch (Exception e) {  
  44.             e.printStackTrace();  
  45.         }  
  46.         System.out.println(obj);  
  47.         return "hello";  
  48.     }  
  49. }  

注意,不要再doInTransaction内做异常捕捉,否则无法控制事物。




  • 发表于 2017-11-09 15:55
  • 阅读 ( 1505 )
  • 分类:Java

1 条评论

请先 登录 后评论
不写代码的码农
泽哥

java

5 篇文章

作家榜 »

  1. 威猛的小站长 124 文章
  2. Jonny 65 文章
  3. 江南烟雨 36 文章
  4. - Nightmare 33 文章
  5. doublechina 31 文章
  6. HJ社区-肖峰 29 文章
  7. 伪摄影 22 文章
  8. Alan 14 文章