事务是企业应用开发中的重要概念,对于部分 Web 应用,事务也是非常重要的(试想一下,如果没有事务,ATM 和网银的操作将会使多么的危险)。下面我就对 Java EE 应用中各种事务技术做一个简介。
数据库:
??????无论 Java EE 中采用了何种的事务技术,归根结底都是基于数据库的事务。不论是本地事务,还是分布式事务,都必须有数据库的支持才行。各种Java EE 事务技术也都调用了数据库的事务功能。提到事务,必然要提到事务的四个基本特性:原子性、一致性、隔离性和持久性。Java EE应用中的各种事务技术直接的或间接的都要保证这四个特性的实现。作为最底层的技术,数据库系统毫无疑问要保证这四个特性被完整的实现。
???? ?数据库提供的事务功能是 Java EE应用中事务的根本。数据库系统一般采用重执行日志保证事务的原子性、一致性和持久性。重执行日志记录了数据库变化的每一个动作,数据库系统会根据重执行日志,在发生错误的时候撤销已执行的操作;或者在数据库重启时,将尚未持久化的数据重新执行操作。
?????对于事务的隔离性,数据库系统采用锁机制来实现,这和 Java采用的对象锁机制实现线程同步类似,只有持有锁的事务才能操作数据。数据库系统为用户提供了手工操作锁机制的功能,用户在执行 DML 操作和SELECT FOR UPDATE时都会获得行锁定,用户也可以进行表锁定。但是手工的操作锁必然是很麻烦的,也容易出现错误,所以数据库系统也提供了自动锁机制,这就引出了数据库的事务隔离级别。只要用户指定会话的事务隔离级别,数据库就会自动的为事务操作加上适当的锁,并维护这些锁。SQL 92标准定义了4个等级的事务隔离级别,不同的隔离级别对各种事务并发问题的解决能力是不同的。
JDBC:
??? ?JDBC 是大家最为熟悉的技术之一,它是通过数据库系统来实现事务的,所以这里对它的介绍不多。只要调用相应的 API就可以了,只要了解数据库系统的事务,理解 JDBC 的事务就非常容易了。使用 JDBC需要数据库的支持,主流的数据库系统都支持单机的事务(相对分布式事务)。当然像一些内存数据库、文件数据库就不好说了。需要说明的是,JDBC的事务只能在一个 Connection 内实现。
JTS 和 JTA:
????? JTS 规定了 App Server 如何为应用程序提供容器级的事务支持。JTA 规定了 App Server 可以向用户提供哪些 API 用于控制事务。
????? JTS/JTA 事务与 JDBC 的事务之间对大的不同是前者可以提供跨越多个数据库连接,而后者只能在单个数据库连接中实现事务。所以 JTS/JTA 事务对于企业级应用来说是非常重要的,也导致了大部分开发者对其不是很了解。
Hibernate:
????? Hibernate 是最常用和最流行的 ORM 框架。Hibernate 也提供了基于 JDBC 和 JTA 的事务功能,这也是将 JTS/JTA 事务放在 Hibernate 前面的原因。
????
?????因为 Hibernate 的事务是基于 JDBC 和 JTA 的,也可以使用容器管理事务,所以很多特性和 JDBC 和 JTA等并无二异。需要特别提到的是 Hibernate 悲观锁和乐观锁这两个概念。Hibernate的悲观锁利用的是数据库的行锁机制。使用悲观锁不仅可以保证本应用内的并发事务行,也可以保证使用相同数据库的其它应用不会访问或修改不应该的数据。但是,悲观锁会影响到应用的并发访问性能。所以,在不是必须使用悲观锁的情况下可以使用乐观锁机制。乐观锁最常见的实现方式是使用 Version字段,这也是 Hibernate所推荐的方式。乐观锁可以保证事务和并发性能的兼得,但缺点是事务仅限于同一应用。关于悲观锁和乐观锁的详情很容易在书籍和网络上找到,这里我就不再拗述。
Spring:
?? ?? Spring 在其它技术的基础上,为开发人员提供了一组统一的易于适用的 API。除了通过编程的方式实现事务外,在 Spring 环境中,也可以使用 XML 或 Annotation 来实现声明式事务。
????? PlatformTransactionManager 在 Spring的事务体系中是非常重要的一部分,它是一个抽象接口。HibernateTransactionManager、JtaTransactionManager 等都实现了这个接口。这些 TransactionManager 的名字都很好理解,我也不多说了。
?? ?? Spring 事务最吸引人的特性是声明式事务。Spring 通过 AOP 技术提供了对声明式事务的支持。随着 Spring 版本的更迭,现在使用 Spring 的事务支持已经变得非常容易了。
???? 除此以外,Spring 还为 JMS 提供了本地事务功能,不过 JMS 的事务和数据库的事务有一定区别,我了解的也不是很多,所以在这里就不再介绍了。
???? 这篇文章简单总结了一下 Java EE 应用中不同技术所提供的事务支持,写的很粗,欢迎大家补充。打算以后再简要介绍一下 Seam 的事务,如果有必要的话,呵呵。
详细解决方案
Java EE 运用中的事务
热度:39 发布时间:2016-04-22 00:28:04.0
相关解决方案
- java 乱码 汉字是 ? 如何转换成汉字
- java web 登录次数限制,该如何解决
- java 工商银行网银支付 B2B的 都亟需什么,需要注意什么
- Java Applet程序从JDK6升级到7时遇到的有关问题
- java web 视频相干
- 请教一个关于链接后缀的有关问题(java web 应用)
- java 系统单点登录解决方案
- java.lang.NumberFormatException: For input string: "id"该如何处理
- java.lang.NoSuchMethodException: setId([Ljava.lang.String;)解决方法
- java 获取客户端IP解决办法
- JAVA 后台怎么获得前台页面FCKedit编辑器中的内容以及内容的样式
- java 正则化匹配有关问题
- java web 受阻
- java.lang.IllegalStateException: No output folder,该怎么解决
- java.lang.NoSuchMethodError: org.springframework.util.ReflectionUtils.makeAccess,该如何解决
- java 乱码有关问题 急求大神
- java EE错误如何解决阿,都是过了,没有能解决的!
- java 工程打包有关问题 多谢各位大神!多谢
- JAVA WEB导航条,该怎么处理
- java.sql.SQLException: Access denied for user 'root'@'localhost' (using password,该如何处理
- java 中Node 有关问题
- 关于 java 引述传递和值传递,你的知否
- 吐了,java Timer 终止不了。
- Java Web 学习中有关问题,请高手指教
- java web中的url地址小疑点。
- java web开发解决办法
- java.lang.NullPointerException解决方法
- 关于 java cast 有关问题,你明白不
- java ftp 下传和上载乱码有关问题
- java web项目上的一些文件