在讲编程式事务之前,我们先来说一下threadlocal。
由于spring为各种支持的持久化技术都提供了简单化操作的模板和回调,这些模板类都是线程安全的。也就是说,多个DAO可以复用同一个模板实例而不会发生冲突。使用模板类访问底层数据的时候,根据底层中的持久化技术不同,模板类需要绑定不同的数据连接或者会话的资源。这些资源都是非线程安全的,也就是说他们不能再同一个时刻被多个线程共享。
针对这个问题,假如一个对象是非线程安全的,在多线程的环境下,对对象的访问必须采用synchronized进行线程同步。但是线程同步会降低线程的性能,而且模板类并未采用线程同步机制。所以,spring针对这点,采用的是springlocal。
ThreadLocal管理request的作用域bean、事务管理、任务调度、AOP等模块中都有他的影子。
ThreadLocal是一个保存线程到本地化对象的容器,当运行多线程环境的一个对象的时候使用threadLocal维护变量,ThreadLocal为每一个使用该变量的线程分配一个独立的变量副本,所以每一个线程都可以独立的改变自己的副本,而不会影响其他线程所对应的副本。所以每一个线程都可以独立的改变自己的副本,而不会影响其他线程所对应的副本。从线程的角度来看,这个变量就像线程专有的本地变量。
Thread是以时间换空间的方式,而ThreadLocal是以空间换时间的方式,