transactionmanagerSpring中在配置<tx:annotation-driven transaction-manager="transactionManager" />

transactionmanager  时间:2021-06-13  阅读:()

jta容器是什么

Java事务API(JTA;Java Transaction API)和它的同胞Java事务服务(JTS;Java Transaction Service),为J2EE平台提供了分布式事务服务。

一个分布式事务(distributed transaction)包括一个事务管理器(transaction manager)和一个或多个资源管理器(resource manager)。

一个资源管理器(resource manager)是任意类型的持久化数据存储。

事务管理器(transaction manager)承担着所有事务参与单元者的相互通讯的责任。

JTA事务比JDBC事务更强大。

一个JTA事务可以有多个参与者,而一个JDBC事务则被限定在一个单一的数据库连接。

下列任一个Java平台的组件都可以参与到一个JTA事务中: .JDBC连接 .JDO PersistenceManager 对象 .JMS 队列 .JMS 主题 .企业JavaBeans(EJB) .一个用J2EE Connector Architecture 规范编译的资源分配器。

如何使用sqlsessiontemplate

工作中,需要学习一下MyBatis sqlSession的产生过程,翻看了mybatis-spring的源码,阅读了一些mybatis的相关doc,对mybatis sqlSession有了一些认知和理解,这里简单的总结和整理一下。

首先, 通过翻阅源码,我们来整理一下mybatis进行持久化操作时重要的几个类: SqlSessionFactoryBuilder:build方法创建SqlSessionFactory实例。

SqlSessionFactory:创建SqlSession实例的工厂。

SqlSession:用于执行持久化操作的对象,类似于jdbc中的Connection。

SqlSessionTemplate:MyBatis提供的持久层访问模板化的工具,线程安全,可通过构造参数或依赖注入SqlSessionFactory实例。

Hibernate是与MyBatis类似的orm框架,这里与Hibernate进行一下对比,Hibernate中对于connection的管理,是通过以下几个重要的类: SessionFactory:创建Session实例的工厂,类似于MyBatis中的SqlSessionFactory。

Session:用来执行持久化操作的对象,类似于jdbc中的Connection。

HibernateTemplate:Hibernate提供的持久层访问模板化的工具,线程安全,可通过构造参数或依赖注入SessionFactory实例。

在日常的开发中,我们经常需要这样对MyBatis和Spring进行集成,把sqlSessionFactory交给Spring管理,通常情况下,我们这样配置: ? 1 2 3 <bean id="sqlSessionFactory" class=&.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> </bean> 通过上面的配置,Spring将自动创建一个SqlSessionFactory对象,其中使用到.mybatis.spring.SqlSessionFactoryBean,其 是MyBatis为Spring提供的用于创建SqlSessionFactory的类,将在Spring应用程序的上下文建议一下可共享的 MyBatis SqlSessionFactory实例,我们可以通过依赖注入将SqlSessionFactory传递给MyBatis的一些接口。

如果通过Spring进行事务的管理,我们需要增加Spring注解的事务管理机制,如下配置: ? 1 2 3 4 5 <bean id="transactionManager" class=&.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <tx:annotation-driven/> 这样,我们就可以使用Spring @Transactional注解,进行事务的控制,表明所注释的方法应该在一个事务中运行。

Spring将在事务成功完成后提交事务,在事务发生错误时进行异常回滚,而且,Spring会将产生的MyBatis异常转换成适当的 essExceptions,从而提供具体的异常信息。

下面,我们通过分析SqlSessionUtils中getSession的源码,来详细的了解一下sqlSession的产生过程,源码如下: public static SqlSession getSqlSession(SqlSessionFactory sessionFactory, ExecutorType executorType, PersistenceExceptionTranslator exceptionTranslator) { notNull(sessionFactory, "No SqlSessionFactory specified"); notNull(executorType, "No ExecutorType specified"); SqlSessionHolder holder = (SqlSessionHolder) getResource(sessionFactory); if (holder != null && holder.isSynchronizedWithTransaction()) { if (holder.getExecutorType() != executorType) { throw new essResourceException("Cannot change the ExecutorType when there is an existing transaction"); } holder.requested(); if (logger.isDebugEnabled()) { logger.debug("Fetched SqlSession [" + holder.getSqlSession() + "] from current transaction"); } return holder.getSqlSession(); } if (logger.isDebugEnabled()) { logger.debug("Creating a new SqlSession"); } SqlSession session = sessionFactory.openSession(executorType); // Register session holder if synchronization is active (i.e. a Spring TX is active) // // Note: The DataSource used by the Environment should be synchronized with the // transaction either through DataSourceTxMgr or another tx synchronization. // Further assume that if an exception is thrown, whatever started the transaction will // handle closing / rolling back the Connection associated with the SqlSession. if (isSynchronizationActive()) { Environment environment = sessionFactory.getConfiguration().getEnvironment(); if (environment.getTransactionFactory() instanceof SpringManagedTransactionFactory) { if (logger.isDebugEnabled()) { logger.debug("Registering transaction synchronization for SqlSession [" + session + "]"); } holder = new SqlSessionHolder(session, executorType, exceptionTranslator); bindResource(sessionFactory, holder); registerSynchronization(new SqlSessionSynchronization(holder, sessionFactory)); holder.setSynchronizedWithTransaction(true); holder.requested(); } else { if (getResource(environment.getDataSource()) == null) { if (logger.isDebugEnabled()) { logger.debug("SqlSession [" + session + "] was not registered for synchronization because DataSource is not transactional"); } } else { throw new essResourceException( "SqlSessionFactory must be using a SpringManagedTransactionFactory in order to use Spring transaction synchronization"); } } } else { if (logger.isDebugEnabled()) { logger.debug("SqlSession [" + session + "] was not registered for synchronization because synchronization is not active"); } } return session; } 上面的getSession方法,会从Spring的事务管理器中获取一个SqlSession或创建一个新的SqlSession,将试图从当前事务中得到一个SqlSession,然后,如果配置有事务管理器的工厂并且Spring 的事务管理器是活跃的,它将会锁定当前事务的SqlSession,保证同步。

主要是通过以下几个步骤进行SqlSession的创建: 它会首先获取SqlSessionHolder,SqlSessionHolder用于在TransactionSynchronizationManager中保持当前的SqlSession。

如果holder不为空,并且holder被事务锁定,则可以通过holder.getSqlSession()方法,从当前事务中获取sqlSession,即 Fetched SqlSession from current transaction。

如果不存在holder或没有被事务锁定,则会创建新的sqlSession,即 Creating a new SqlSession,通过sessionFactory.openSession()方法。

如果当前线程的事务是活跃的,将会为SqlSession注册事务同步,即 Registering transaction synchronization for SqlSession。

ssh整合中出现creating bean with name 'transactionManager' defined in class path resource 错误

说明你在applicationContext.xml中没有UserDAO,没有依赖注入,或是你注入的名称与你applicationContext.xml中配置的名称不一致,注意在配置文件中是区分大小的。

检查一下有没有<bean id="UserDAO">这样的bean

spring的事务管理有几种方式实现,如何实现

Spring+Hibernate的实质: 就是把Hibernate用到的数据源Datasource,Hibernate的SessionFactory实例,事务管理器HibernateTransactionManager,都交给Spring管理。

那么再没整合之前Hibernate是如何实现事务管理的呢? 通过ServletFilter实现数据库事务的管理,这样就避免了在数据库操作中每次都要进行数据库事务处理。

一.事务的4个特性: 原子性:一个事务中所有对数据库的操作是一个不可分割的操作序列,要么全做,要么全部做。

一致性:数据不会因为事务的执行而遭到破坏。

隔离性:一个事务的执行,不受其他事务(进程)的干扰。

既并发执行的个事务之间互不干扰。

持久性:一个事务一旦提交,它对数据库的改变将是永久的。

二.事务的实现方式: 实现方式共有两种:编码方式;声明式事务管理方式。

基于AOP技术实现的声明式事务管理,实质就是:在方法执行前后进行拦截,然后在目标方法开始之前创建并加入事务,执行完目标方法后根据执行情况提交或回滚事务。

声明式事务管理又有两种方式:基于XML配置文件的方式;另一个是在业务方法上进行@Transactional注解,将事务规则应用到业务逻辑中。

三.创建事务的时机: 是否需要创建事务,是由事务传播行为控制的。

读数据不需要或只为其指定只读事务,而数据的插入,修改,删除就需要事务管理了。

一种常见的事务管理配置:事务拦截器TransactionInterceptor和事务自动代理BeanNameAutoProxyCreator相结合的方式 <!--定义Hibernate的事务管理器HibernateTransactionManager --> <bean id="transactionManager" class=&.springframework.orm.hibernate3.HibernateTransactionManager"> <!-- 依赖注入上面定义的sessionFactory --> <property name="sessionFactory" ref="sessionFactory"/> </bean> <!--定义Spring的事务拦截器TransactionInterceptor --> <bean id="transactionInterceptor" class=&.springframework.transaction.interceptor.TransactionInterceptor"> <!-- 依赖注入上面定义的事务管理器transactionManager --> <property name="transactionManager" ref="transactionManager"/> <!-- 定义需要进行事务拦截的方法及所采用的事务控制类型 --> <property name="transactionAttributes"> <props> <!-- 以browse、list、load、get及is开头的所有方法采用只读型事务控制类型 --> <prop key="browse*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="list*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="load*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="is*">PROPAGATION_REQUIRED,readOnly</prop> <!-- 所有方法均进行事务控制,如果当前没有事务,则新建一个事务 --> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <!-- 定义BeanNameAutoProxyCreatorf进行Spring的事务处理--> <bean class=&roxy.BeanNameAutoProxyCreator"> <!-- 针对指定的bean自动生成业务代理 --> <property name="beanNames"> <list> <value>adminService</value> <value>columnsService</value> <value>newsService</value> <value>crawlService</value> <value>memberLevelService</value> <value>memberService</value> <value>categoryService</value> <value>merService</value> <value>cartService</value> <value>ordersService</value> <value>trafficService</value> </list> </property> <!-- 这个属性为true时,表示被代理的是目标类本身而不是目标类的接口 --> <property name="proxyTargetClass"> <value>true</value> </property> <!-- 依赖注入上面定义的事务拦截器transactionInterceptor --> <property name="interceptorNames"> <list> <value>transactionInterceptor</value> </list> </property> </bean> 尤其注意:如下 *********************************************************************************************************** 【以上的事务拦截器和事务自动代理方式实现原理:像Struts2一样,都是凭借强大的拦截器功能对业务逻辑方法的调用进行拦截,然后又BeanNameAutoProxyCreator自动生成事务代理,最后送事务管理器,统一管理】 *********************************************************************************************************** Spring+Hibernate的实质: 就是把Hibernate用到的数据源Datasource,Hibernate的SessionFactory实例,事务管理器HibernateTransactionManager,都交给Spring管理。

那么再没整合之前Hibernate是如何实现事务管理的呢? 通过ServletFilter实现数据库事务的管理,这样就避免了在数据库操作中每次都要进行数据库事务处理。

一.事务的4个特性: 原子性:一个事务中所有对数据库的操作是一个不可分割的操作序列,要么全做,要么全部做。

一致性:数据不会因为事务的执行而遭到破坏。

隔离性:一个事务的执行,不受其他事务(进程)的干扰。

既并发执行的个事务之间互不干扰。

持久性:一个事务一旦提交,它对数据库的改变将是永久的。

二.事务的实现方式: 实现方式共有两种:编码方式;声明式事务管理方式。

基于AOP技术实现的声明式事务管理,实质就是:在方法执行前后进行拦截,然后在目标方法开始之前创建并加入事务,执行完目标方法后根据执行情况提交或回滚事务。

声明式事务管理又有两种方式:基于XML配置文件的方式;另一个是在业务方法上进行@Transactional注解,将事务规则应用到业务逻辑中。

三.创建事务的时机: 是否需要创建事务,是由事务传播行为控制的。

读数据不需要或只为其指定只读事务,而数据的插入,修改,删除就需要事务管理了。

一种常见的事务管理配置:事务拦截器TransactionInterceptor和事务自动代理BeanNameAutoProxyCreator相结合的方式 <!--定义Hibernate的事务管理器HibernateTransactionManager --> <bean id="transactionManager" class=&.springframework.orm.hibernate3.HibernateTransactionManager"> <!-- 依赖注入上面定义的sessionFactory --> <property name="sessionFactory" ref="sessionFactory"/> </bean> <!--定义Spring的事务拦截器TransactionInterceptor --> <bean id="transactionInterceptor" class=&.springframework.transaction.interceptor.TransactionInterceptor"> <!-- 依赖注入上面定义的事务管理器transactionManager --> <property name="transactionManager" ref="transactionManager"/> <!-- 定义需要进行事务拦截的方法及所采用的事务控制类型 --> <property name="transactionAttributes"> <props> <!-- 以browse、list、load、get及is开头的所有方法采用只读型事务控制类型 --> <prop key="browse*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="list*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="load*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="is*">PROPAGATION_REQUIRED,readOnly</prop> <!-- 所有方法均进行事务控制,如果当前没有事务,则新建一个事务 --> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <!-- 定义BeanNameAutoProxyCreatorf进行Spring的事务处理--> <bean class=&roxy.BeanNameAutoProxyCreator"> <!-- 针对指定的bean自动生成业务代理 --> <property name="beanNames"> <list> <value>adminService</value> <value>columnsService</value> <value>newsService</value> <value>crawlService</value> <value>memberLevelService</value> <value>memberService</value> <value>categoryService</value> <value>merService</value> <value>cartService</value> <value>ordersService</value> <value>trafficService</value> </list> </property> <!-- 这个属性为true时,表示被代理的是目标类本身而不是目标类的接口 --> <property name="proxyTargetClass"> <value>true</value> </property> <!-- 依赖注入上面定义的事务拦截器transactionInterceptor --> <property name="interceptorNames"> <list> <value>transactionInterceptor</value> </list> </property> </bean> 尤其注意:如下 *********************************************************************************************************** 【以上的事务拦截器和事务自动代理方式实现原理:像Struts2一样,都是凭借强大的拦截器功能对业务逻辑方法的调用进行拦截,然后又BeanNameAutoProxyCreator自动生成事务代理,最后送事务管理器,统一管理】 ***********************************************************************************************************

ibatis中transactionManager和dataSource的区别

DataSourceTransactionManager:事务管理器 对JDBC(Java Data Base Connectivity,java数据库连接)进行事务管理,在spring中是对JdbcTemplate进行事务管理 扩展: HibernateTransactionManager:是对Hibernate进行事务管理,当在spring中使用Hi...

Spring中在配置<tx:annotation-driven transaction-manager="transactionManager" />

<tx:annotation-driven transaction-manager="transactionManager" />对@Transactional这个注解进行的驱动,这是基于注解的方式使用事务配置声明,这样在具体应用中可以指定对哪些方法使用事务。

再看你说的接口,Spring是面向接口编程的,Spring依赖注入是通过动态代理实现的,利用反射技术在运行时获得实例对象的一些信息。

况且不用接口的话,还用spring注入干嘛?还不如直接在类中new了。

819云互联 香港 日本 美国 2核4G 18元 8核8G 39元 免费空间 免费CDN 香港 E3 16G 20M 230元/月

819云互联是海外领先的互联网业务平台服务提供商。专注为用户提供低价高性能云计算产品,致力于云计算应用的易用性开发,并引导云计算在国内普及。目前平台研发以及运营云服务基础设施服务平台(IaaS),面向全球客户提供基于云计算的IT解决方案与客户服务,拥有丰富的海外资源、香港,日本,美国等各国优质的IDC资源。官方网站:https://www.819yun.com香港特价物理服务器:地区CPU内存带宽...

wordpress专业外贸建站主题 WordPress专业外贸企业网站搭建模版

WordPress专业外贸企业网站搭建模版,特色专业外贸企业风格 + 自适应网站开发设计 通用流行的外贸企业网站模块 + 更好的SEO搜索优化和收录 自定义多模块的产品展示功能 + 高效实用的后台自定义模块设置!采用标准的HTML5+CSS3语言开发,兼容当下的各种主流浏览器: IE 6+(以及类似360、遨游等基于IE内核的)、Firefox、Google Chrome、Safari、Opera...

RAKsmart 年中活动 独立服务器限时$30秒杀 VPS主机低至$1.99

RAKsmart 虽然是美国主机商,但是商家的主要客户群还是在我们国内,于是我们可以看到每次的国内节日促销活动期间商家也会发布促销。包括这次年中大促活动,RAKsmart商家也有发布为期两个月的年终活动,其中有商家擅长的独立服务器和便宜VPS主机。服务器包括站群服务器、特价服务器、高达10G带宽不限制流量的美国服务器。商家优惠活动,可以看到对应商品的优惠,同时也可以使用 优惠码 RAKBL9 同时...

transactionmanager为你推荐
企业资源管理系统企业人力资源管理系统的重要性?数据监测毕业论文检测,万方数据检测结果可靠吗?跟知网的有多少差距啊?求以往学长学姐解释。orphanremovalhibernate一对多,操作一的一方,如何删除多的一方的数据。oa办公系统下载完全免费的oa办公系统模式识别算法算法是编程么?考研学模式识别方向,编程多么?qq网络硬盘怎么用qq网络硬盘云计划云计划创富平台怎么样?有谁知道。介绍一下。什么是生态系统生态系统的基础是什么?labelforhtml标签中lable的for属性有什么作用?数据库界面如何创建数据库
万网域名注册 万网域名代理 免费vps 国内vps 美国vps推荐 腾讯云数据库 seovip patcha 网通服务器ip ibox官网 上海域名 刀片式服务器 免费phpmysql空间 搜索引擎提交入口 中国电信宽带测速器 跟踪路由命令 秒杀品 阿里云手机官网 美国迈阿密 广东主机托管 更多