java事务实现世界可分为两种
一种是jdbc事务,也叫本地事务,令外一种是JTA事务,也叫全局事务。简要介绍下JTA API
javax.transaction.Status JTA事务状态,使用方式 常被作为判断条件做处理
javax.transaction.Synchronization 定义了事务完成前后改做的事,使用方式一般是先注册,在适当的时机调javax.transaction.Transaction 定义了操作全:事务提交,回滚,绑定或解绑资源事务与资源,获取状态,设置回滚,同步
javax.transaction.TransactionManager定义了事务的所有动作,一般由应用服务器采用jts实现
javax.transaction.TransactionSynchronizationRegistry定义了同步,但是同步的调用时机更接近2阶段提交,也就是说beforeComplete晚于Transaction注册的beforeComplete执行,afterComplete早于Transction的afterComplete执行
javax.transaction.UserTransaction提供给应用客户端化分事务边界的方法
javax.transaction.xa.XAResource定义了资源管理器与事务管理器的通信
javax.transaction.xa.Xid定义了资源事务关联的唯一标识,就好比树的枝干,每个资源管理器做的事就对应一条枝干的标识,而所有的枝干都长在一个树上象征着在每个资源管理器上做的事就对应着整颗树。Xid中包括全局事务格式,标识,分支标识。
为了更好的理解JTA实现,可参看更好的理解JTA。
org.hibernate.Transaction统一了各种事务的具体实现
JDBCTransaction
JTATransaction
CMTTransaction(事务托管给应用服务器完成)
三者都认为一个session只能允许同一时刻只能由一个未提交事务,实现中大量代码主要体现在事务提交前前后后的同步问题,我们将同步分为本地同步和JTA同步,之所以分开讨论,是因为这两种同步不能同时存在以上三种之一实现中。
如果条件flushBeforeCompletionEnabled||autoCloseSessionEnabled||connectionReleaseMode ==ConnectionReleaseMode.AFTER_TRANSACTION,即事务完成之前是否flush session,事务完成之后事务自动关闭 session,连接释放是否在提交事务之后 不为真,那么认为本地同步;
如果为真,则进行如下判断
如果采用的实现类是JBCTransaction或者TransactionManager没找到或者事务已经完成(提交或回滚,未激活等)或事务被标识为回滚,则为本地同步
否则,为JTA同步。
JDBCTransaction中
如果为本地同步并且flushmode !=Flushmode.Never则刷新session
如果为本地同步,则执行org.hibernate.jdbc.JDBCContext中的beforeTransactionCompletion和afterTransactionCompletion,同时执行synchronizations集合中的各个同步类(都是javax.transaction.Synchronization实现)
JTATransaction中
如果不是JTA同步,则认为是本地同步
如果是JTA同步,则同步方法的执行又JTA实现自动完成,hibernate不干预
如果是本地同步或!flushBeforeCompletionEnabled并且flushModel!=flushModel.Never,则刷新session
如果是本地同步并且JTA事务是通过Transaction begin启动,则执行beforeTransactionCompletion
如果JTA不是通过Transaction begin启动,则Transaction commit并不会真正触发提交
如果是本地同步,则执行afterTransactionCompletion
CMTTransaction中
如果不是JTA同步,Transaction begin抛出异常
如果是JTA同步并且!flushBeforeCompletionEnabled并且flushModel!=flushModel.Never,则刷新缓存
三种实现的总结:
JDBCTransaction只会执行本地同步
它通过java.sql.Connection实现,并会执行JdbcContext.beforeTransactionCompletion和afterTransactionCompletion
JTATransaction既可以进行JTA同步,也可进行本地同步;
它通过userTransaction实现,
但在调用Transaction begin方法之前,事务允许通过userTransaction.begin开始,如果不是调用Transaction begin开启事务的,那自然就不会调用JdbcContext.beforeTransactionCompletion。如果是本地同步的话,还可以调用jdbcContext.afterTransactionCompletion
CMTTransaction不会进行实质性的事务开始,提交,回滚,超时,只设置回滚标志,当调用Transaction begin方法时会调用registerSynchronizationIfPossible而此时会在事务管理器上注册同步org.hibernate.transaction.CacheSynchronization,间接调用调用JdbcContext.beforeTransactionCompletion和afterTransactionCompletion,
三种事务的创建由对应的JDBCTransactionFactory,JTATransactionFactroy,CMTTransactionFactory完成
这三者区别在
connectionReleaseMode
JTATransactionFactroy和CMTTransactionFactory连接释放模式执行每条语句后释放连接,JDBCTransactionFactory事务提交后释放,因此jta事务连接的重用高
TransactionManager
JDBCTransactionFactory和JTATransactionFactroy不需要TransactionManager,CMTTransactionFactory必须
isTransactionInProgress
JDBCTransactionFactory确定执行JDBCTransaction begin方法,但没提交或回滚过视为正在进行
JTATransactionFactroy
通过缓存的JTATransaction.getUserTransaction状态确定
如果找不到,通过transactionManager状态确定
如果找不到,通过JNDI查找userTransaction状态确定
CMTTransactionFactory
通过transactionManager.getTransaction状态确定
factory通过org.hibernate.transaction.TransactionFactoryFactory.buildTransactionFactory确定,简单表述下
通过hibernate.transaction.factory_class确定,如果为空,返回JDBCTransactionFactory
否则实例化hibernate.transaction.factory_class指定类,并调用configure方法
事务管理器transactionManager
TransactionManagerLookupFactory.getTransactionManagerLookup根据hibernate.transaction.manager_lookup_class确定TransactionMangerLookup,简要介绍TransactionMangerLookup
public TransactionManager getTransactionManager(Properties props) throws HibernateException//获取JTA 事务管理器
public String getUserTransactionName();//获取JTA UserTransaction的JNDI名称
TransactionManager实现方式可分为通过JNDI查找实例和通过实例化方式;
如WeblogicTransactionManagerLookup会在JNDI上下文中查找名称为javax.transaction.TransactionManager的事务管理器
而WebSphereTransactionManagerLookup根据webSphere服务器版本加载对应的class,查找顺序为
5.1 ->com.ibm.ws.Transaction.TransactionManagerFactory
5.0->com.ibm.ejs.jts.jta.TransactionManagerFactory
4.0->com.ibm.ejs.jts.jta.JTSXA
这些类都实现了getTransactionManager静态方法,通过java反射机制获取事务管理器
JOnASTransactionManagerLookup加载org.objectweb.jonas_tm.Current,再通过反射机制调用getTransactionManager静态方法
JOTMTransactionManagerLookup加载org.objectweb.jotm.Current
当然还提供了LocalTransactionManagerLookup,查找spring管理的JTA TransactionManager实现(通过注入LocalSessionFactoryBean的transactionManager属性。
分享到:
相关推荐
在对比分析中,我们可以看到MySQL的事务支持更加成熟和全面,而MongoDB虽然在4.0版本中增加了多文档事务,但仍然存在一些限制,特别是在分布式和大事务处理方面。选择使用哪种数据库取决于应用的需求,如对事务复杂...
3. **事务隔离级别**:Spring支持四种标准的事务隔离级别,包括READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ和SERIALIZABLE。不同的隔离级别可以防止并发操作引发的数据不一致问题,但也会对性能产生影响,...
立信会计师事务所SWOT分析 本篇资源摘要信息主要是对立信会计师事务所的SWOT分析,通过对立信会计师事务所的优势、劣势、机会和威胁等加以综合评估与分析得出结论,以确定立信会计师事务所的资源优势和缺陷,并...
C# 中增加 SQLite 事务操作支持与使用方法 在 C# 中使用 SQLite 数据库时,事务操作是非常重要的一部分。事务操作可以确保数据库的数据一致性和完整性,避免数据不一致的情况。下面将详细介绍 C# 中增加 SQLite ...
每个 SQL Server 数据库都有事务日志,用于记录所有事务以及每个事务所做的数据库修改。 你是否想读取和分析SQL Server日志文件 (.ldf) ?...(4)支持版本,2005级以上,预计2012及以上版本是没有问题的。
本文将全面分析Spring中的编程式事务管理和声明式事务管理,旨在帮助开发者深入理解这两种事务管理方式,并在实际项目中合理选择。 **编程式事务管理** 编程式事务管理是通过代码直接控制事务的开始、提交、回滚等...
【Spring框架的事务管理应用分析】 Spring框架是一个在2003年推出的开源项目,它的核心设计理念源于Rod Johnson的《Expert One-on-One J2EE Design and Development》一书中的实用主义J2EE思想。Spring框架主要包括...
事务分析可视化建设方案是针对企业或组织在处理大量事务数据时,如何通过可视化技术提高效率、洞察业务状况的一种综合解决方案。本方案旨在构建一个统一的事务处理平台,以实现事务的高效管理和分析,并通过视觉化的...
Spring 事务属性分析: 1. 隔离级别:如上所述,事务隔离级别是确保并发事务之间数据一致性的重要手段。Spring 提供了五种隔离级别,分别是 `ISOLATION_DEFAULT`、`ISOLATION_READ_UNCOMMITTED`、`ISOLATION_READ_...
【InterSystems IRIS数据平台】是一款专为事务和分析型应用程序设计的新型数据平台,它融合了事务处理和分析处理的能力,旨在满足实时业务需求。IRIS的核心特性包括: 1. **高性能处理**:IRIS提供了并行的事务处理...
《InnoDB事务、锁、多版本分析》 InnoDB存储引擎是MySQL数据库中广泛使用的存储引擎,以其强大的事务处理能力和高并发性能而闻名。本文将深入探讨InnoDB的事务、锁以及多版本并发控制(MVCC)机制。 首先,InnoDB...
在事务处理过程中,ACID(原子性、一致性、隔离性和持久性)属性的实现也离不开事务日志的支持。原子性保证事务作为一个整体执行,或者全部不执行;一致性确保事务结束后,数据库处于合法状态;隔离性防止并发事务间...
【Spring 事务分析】 Spring 框架以其强大的事务管理能力而闻名,它为开发者提供了声明式和编程式两种事务管理方式,使得在Java应用程序中处理事务变得简单且灵活。 1. **Spring 事务** - 事务管理是确保一组...
对于Oracle数据库而言,使用`BasicDataSource`能够提供更好的性能和稳定性支持,从而避免事务提交失败等问题的发生。此外,还需要注意事务管理器的正确配置,确保所有事务相关的组件都正确地引用了同一个数据源实例...
- **使用场景**:当不需要事务支持时,如只涉及大量的SELECT和INSERT操作时,可以选择MyISAM。 - **重要的配置参数**:`key_buffer`用于缓存MyISAM索引块。 - **状态参数**: - `key_read_requests`:表示从缓存中...
Spring事务管理主要针对企业级应用中的数据持久化层提供支持。它通过统一的事务管理机制,使得开发者能够更加专注于业务逻辑的实现,而不是事务的具体细节。Spring事务管理的核心在于其灵活性和易用性,能够适应不同...
DB 查询分析器支持两种主要的事务管理模式: 1. **自动提交事务**:这是默认的事务管理模式,在此模式下,用户无需手动管理事务,所有执行的SQL语句都会自动提交给数据库管理系统(DBMS)。例如,在执行`DELETE`语句...
事务与分析一体化(HTAP,Hybrid Transaction/Analytic Processing)数据库架构是现代数据库技术的重要发展方向,旨在解决传统数据库系统在事务处理(OLTP,Online Transaction Processing)和分析处理(OLAP,On...
它支持事务处理,这使得它在需要ACID特性的应用中非常有用。本文将深入探讨RocksDB的事务实现,主要关注Log Sequence Number (LSN)、Snapshot以及隔离级别。 1. **LSN (Log Sequence Number)** LSN是RocksDB用来...