用ThreadLocal管理事务

1、适用场景

一个service,操作两个dao,要求两个dao为同一个事务,要么全成功,要么全失败。

DBUtils,使用ThreadLocal

 1 public class DbUtils {
 2     //线程局部数据容器
 3     private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
 4     private static DataSource ds;
 5     private static Connection conn;
 6     static{
 7         ds=new ComboPooledDataSource();
 8     }
 9
10     public static DataSource getdDataSource()
11     {
12         return ds;
13     }
14     public static Connection getcConnection()
15     {
16
17         try {
18             conn=tl.get();//是否已经有值
19             if(conn==null)//没有值就添加
20             {
21                 conn=ds.getConnection();
22                 tl.set(conn);
23             }
24
25         } catch (SQLException e) {
26             e.printStackTrace();
27         }
28         return conn;
29     }
30
31     public static void remove()
32     {
33         tl.remove();//实现一个删除thredlocal中与线程相关的对象
34     }
35 }

过滤器中管理事务

 1 public void doFilter(ServletRequest request, ServletResponse response,
 2             FilterChain chain) throws IOException, ServletException {
 3         Connection conn = null;
 4         try {
 5             conn = DbUtils.getcConnection();
 6             conn.setAutoCommit(false);
 7             chain.doFilter(request, response);//放行
 8             conn.commit();//如果没有出错,提交事务,所以需要在dao中抛出异常,不能try-catch,否则无法捕捉到错误
 9             System.err.println("成功.......................");
10         } catch (Exception e) {
11             System.err.println("出错了......................");
12             try {
13                 //判断是否是数据库错误,如果不是还是提交
14                 if (e instanceof SQLException) {
15                     conn.rollback();
16                 } else {
17                     conn.commit();
18                 }
19             } catch (SQLException e1) {
20                 e1.printStackTrace();
21             }
22         } finally {
23             try {
24                 conn.close();//关闭连接
25                 DbUtils.remove();//实现一个删除thredlocal中与线程相关的对象
26             } catch (SQLException e) {
27                 e.printStackTrace();
28             }
29         }
30     }

注意:必须在dao中抛出异常,否则无法捕捉到,永远是提交事务。

dao层:

try {
                DataSource ds=DbUtils.getdDataSource();
                Connection conn=ds.getConnection();
                QueryRunner run =new QueryRunner(ds);
                String sql="INSERT INTO users VALUES (?,?,? ";
                run.update(conn, sql,"U005","Tom","456");
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }

如果需要进行事务的管理,添加到过滤器url中即可

时间: 2024-10-25 10:43:22

用ThreadLocal管理事务的相关文章

Spring中的事物管理,用 @Transactional 注解声明式地管理事务

事物: 事务管理是企业级应用程序开发中必不可少的技术,  用来确保数据的 完整性和 一致性. 事务就是一系列的动作, 它们被当做一个单独的工作单元. 这些动作要么全部完成, 要么全部不起作用 事务的四个关键属性: 原子性:事务是一个原子操作, 由一系列动作组成. 事务的原子性确保动作要么全部完成要么完全不起作用. 一致性:一旦所有事务动作完成, 事务就被提交. 数据和资源就处于一种满足业务规则的一致性状态中. 隔离性:可能有许多事务会同时处理相同的数据, 因此每个事物都应该与其他事务隔离开来,

对Spring 容器管理事务支持的总结

1.问题 Java代码   Connection conn = DataSourceUtils.getConnection(); //开启事务 conn.setAutoCommit(false); try { Object retVal = callback.doInConnection(conn); conn.commit(); //提交事务 return retVal; }catch (Exception e) { conn.rollback();//回滚事务 throw e; }final

java笔记--用ThreadLocal管理线程,Callable&lt;V&gt;接口实现有返回值的线程

用ThreadLocal管理线程,Callable<V>接口实现有返回值的线程 ThreadLocal在我的笔记"关于线程同步"的第5种方式里面有介绍,这里就不多说了. --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3899890.html  "谢谢-- Callable<V>接口类似于Runnable,两者都是为了哪些其实例可能被另一个线程执行的类设计的, 但是Runnable不会返回

使用Spring注解方式管理事务与传播行为详解

使用Spring注解方式管理事务 前面讲解了怎么使用@Transactional注解声明PersonServiceBean底下所有的业务方法需要事务管理,那么事务是如何来管理的呢? 我们知道当每个业务方法执行的时候,它都会打开事务,在业务方法执行结束之后,它就会结束事务.那么它什么时候决定这个事务提交,什么时候决定这个事务回滚呢?原先我们手工控制事务的时候,通常这个事务的提交或回滚是由我们来操纵的,那现在我们采用容器的声明式事务管理,那我们如何知道事务什么时候提交,什么时候回滚呢?答案是:Spr

spring+springMVC中使用@Transcational方式管理事务的必须要配的东西。

spring中管理事务的配置方式除了@Transcational还有使用aop等,本文介绍@Transcational方式,但是推荐使用aop方式.因为如果有多个事务管理器的话,你在注解中还需要注明使用哪个事务管理器@Transactional("transactionManager1"). 一.spring中一定要记得加载所有需要的bean 如果使用注解方式的话一定要记得扫描注解,下边的例子表示扫描xxx.xxx下所有文件(包含每一级子文件夹)中除了@Controller以外的所有注

Spring整合JDBC以及AOP管理事务

本节内容: Spring整合JDBC Spring中的AOP管理事务 一.Spring整合JDBC Spring框架永远是一个容器,Spring整合JDBC其实就是Spring提供了一个对象,这个对象封装了JDBC技术,它可以操作数据库,这个对象可以放入Spring容器,交给Spring容器来管理.所以我们主要是要学习这个对象:JDBCTemplate.这个对象和DBUtils中的QueryRunner非常相似. 1. 导包 4+2+2(测试需要的包spring-test,新版本测试时还需要sp

Spring怎么管理事务?

我们一般通过aop管理事务,就是把代码看成一个纵向有序的,然后通过aop管理事务,就好比增删改的时候需要开启一个事务,我们给他配置一个required,required就是有事务就执行事务,没有就给他创建一个事务.查的时候不需要开启事务,就给他配置一个supports,supports就是说他有事务就执行事务,没有的话就不执行. 事务四特性: ACID ----->原子性(事务操作最基本单元,要么全部成功,要么全部失败) 一致性(指一个事务执行之前和执行之后数据库都必须处于一致性状态,事务成功,

ThreadLocal来管理事务

ThreadLocal (扩展) 1 ThreadLocal API ThreadLocal类只有三个方法: l  void set(T value):保存值: l  T get():获取值: l  void remove():移除值. 2 ThreadLocal的内部是Map ThreadLocal内部其实是个Map来保存数据.虽然在使用ThreadLocal时只给出了值,没有给出键,其实它内部使用了当前线程做为键. class MyThreadLocal<T> { private Map&

ThreadLocal 开启事务

1.ThreadLocal该类提供了线程局部变量 2.分析原理: ThreadLocal内部有一个Map.Map的key是当前线程对象,value是一个Object对象. 模拟该类: public class ThreadLocal<T>{ private Map<Runnable,T> map = new HashMap<Runnable,T>(); public void set(T t){ map.put(Thread.currentThread(),t); //