Java Transactions
说到事务我们很容易能想到ACID这四个特性,以及一系列在违反ACID原则时会产生的各种情况和问题。可能在传统的引入式教学中,我们都会拿数据库的例子来做这部分讲解,所以给人的一种感觉就是只有对数据库的一系列操作会引发脏读、幻读等问题,其实这类事务在分类中属于本地事务模型,而Java中的事务类型可以分为三种:本地事务模型(Local Transaction Model),编程式事务模型(Programmatic Transaction Model)和声明式事务模型(Declarative Transaction Model)。
本地事务模型(Local Transaction Model),事实上不是编程框架本身来管理事务,事务由本地资源管理器(Local resource manager)来管理。资源管理器是用于通信的数据源的提供者。对于数据库,资源管理器是通过数据库驱动和数据库管理系统(DBMS)来实现的。这一部分,我们可以想到JDBC操作数据库时,对事务的管理。
编程式事务模型(Programmatic Transaction Model),利用java事务API(Java Transaction API)及其底层事务服务实现技术支持。这里编程也用到了我们常用的commit()、rollback()等方法来管理事务。这一部分,我们可以很容易的联想到Hibernate编程中,对session的事务管理。
声明式事务模型(Declarative Transaction Model),在spring编程中,我们可以通过配置applicationContext.xml文件来管理事务,配置事务的传播特性。
下面先关心一下ACID:Atomicity、Consistency、Isolation、Durability,以及违反ACID可能出现的问题:
脏读:指一个事务读取到了另一个事务未提交的数据。
不可重复读:在一个事务内,多次读取,前后读取的值不同(一个事务读取到另一个事务已提交的数据)。
幻读:前后两次读的结果不一样。
对开发人员可用的事务设置是事务的隔离级别。事务隔离(transaction isolation)是指交织在一起发生的事务之间相互影响的程度。它决定了在其他事务访问和更新同一份数据时,一个事务对更新所允许的可见程度。关系数据库、Spring都允许设定事务的隔离级别,这样的设置是数据库和应用服务器实现相互依赖的。应用服务器可能支持多种隔离级别,对应的数据库必须支持这些同样的隔离级别,这些设置才可能真正生效。
一般数据库的隔离级别如下:
Serializable:可避免脏读、幻读、不可重复读。一般应用于统计时。
Repeatable Read:可避免脏读、不可重复读。MySQL默认。
Read Committed:可避免脏读。一般用于查询。
Read Uncommitted
其中Oracle支持read committed和Serializable。
本地事务模型
在这一部分我们很可以在JDBC编程时使用,我们只要手动开启事务就能手动管理事务了。
conn=DButils.getConnection();
conn.setAutoCommit(false);
conn.commit();
conn.rollback();
编程式事务模型
编程式事务模型与本地事务模型最大的不同是,开发的时候,管理的是事务而不是连接。编程式事务通常的应用环境是客户端发起事务(client-initiated transaction)的情形。即客户端为一个业务做多次远程方法调用的时候。另一个场景是使用本地的JTA事务(localized JTA transaction)和长时间运行的JTA事务。
声明式事务模型
这一部分将以Spring为例。在Spring的事务声明中,一般都通过applicationContext.xml进行配置。通常可有六种事务属性的设置:required、supports、mandatory、requires_new、Not_supported和never。Spring还有一个附加的Nested属性。该属性告知Spring进行事务嵌套,并采用required属性。一个简单的事务配置如下:
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<!-- 配置事务的传播特性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add" propagation="REQUIRED"/>
<tx:method name="del" propagation="REQUIRED"/>
<tx:method name="modify" propagation="REQUIRED"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- 哪些类的哪些方法参与事务 -->
<aop:config>
<aop:pointcut id="allManagerMethod" expression="execution(* com.a2.usermgr.manager.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod"/>
</aop:config>
事务的设计模式(Transaction Design Pattern)
事务设计模式的划分基于组件责任模型,基于有关模型某个应用组件类型拥有开启和管理事务的责任。一般可分为:客户端拥有事务的设计模式(client owner transaction design pattern),领域服务拥有事务的设计模式(domain service owner transaction design pattern)和服务器端代理拥有事务的设计模式(server delegate owner transaction design pattern)。
上周做了个实验,JDBC插MySQL数据库,默认采用InnDB(transaction safe, disk based storage engine with row locking),每秒能插入个几百条(数据是从磁盘读的,还做了相关处理),同样的情况下,若采用MylSAM(very fast, disk based storage engine without support for transaction),每秒能插入一万条以上的数据。所以……没有所以了。
以上只是一种思路,具体的实现网上应该都有成篇的代码。个人愚见,谢谢观看。
本文原创,部分引用InfoQ中相关文章,转载请指明出处,谢谢。
分享到:
相关推荐
- **各种Java应用的展示**:企业级信息系统、各种类型的JavaBeans及其开发工具,以及用于企业的Java Transactions Service软件等。 - **嵌入式Java技术的应用**:例如,使用Java芯片制作的Java Ring(Java戒指),...
4. **Java Transactions**:`jtxer.zip`涉及Java事务管理,这包括ACID(原子性、一致性、隔离性、持久性)原则,以及如何在Java应用中实现事务控制。例如,使用JDBC的`Connection`对象的`setAutoCommit()`方法或通过...
Atomikos Transactions JMS 是一个专门用于处理分布式事务管理的Java库,主要针对JMS(Java Message Service)环境。这个库被封装在名为"atomikos-transactions-jms.jar"的JAR文件中,通常作为开发人员在构建支持...
Atomikos Transactions JDBC是一个强大的开源工具,专为解决Java环境下的分布式事务问题而设计。这个库封装了事务管理的复杂性,提供了一种简单易用的方式来处理跨多个数据源的事务。本文将深入探讨Atomikos ...
Atomikos Transactions JTA 是一个开源的企业级事务处理解决方案,主要针对Java应用程序,尤其是那些运行在Java EE(Enterprise Edition)环境中的应用。JTA(Java Transaction API)是Java平台的标准接口,用于处理...
unfolding-java-transactions, 这是一本针对explaing如何工作的开放书 打开Java事务打开图书简介这本书是以开放源码的方式写的,而写它的理由可能会在这里找到。编写指南本书是使用 Asciidoctor 编写的,它提供:一...
JAVA分布式事务atomikos atomikos jar 包 transactions-jdbc-4.0.4.jar
例如,可以从`Inventory.txt`文件中读取库存记录,并从`Transactions.txt`中读取交易记录。 - **写入文件**:同样地,通过`FileOutputStream`或`BufferedWriter`等类可以将数据写入文件。例如,将处理后的发货记录...
Atomikos Transactions API 是一个广泛使用的开源事务处理API,它为Java应用程序提供了分布式事务管理的能力。这个名为"atomikos-transactions-api.jar.zip"的压缩包包含了一个名为"atomikos-transactions-api.jar...
#### 事务管理(Transactions) 事务管理是分布式系统中的一个核心概念,它确保了数据的一致性和完整性。EJB提供了声明式和编程式两种事务管理方式,开发者可以根据需要选择适合的事务管理策略。 #### 拦截器...
- Transactions:支持多文档事务,保证数据一致性。 6. 性能优化: - 缓存管理:适当配置MongoClient实例的连接池大小和超时时间。 - 使用连接池:复用MongoClient实例以减少建立连接的开销。 - 查询优化:避免...
10. **Transactions**:Java EE 5提供了事务管理功能,允许开发者控制应用程序中的事务边界,确保数据的一致性。 通过阅读"java ee5 document",开发者可以深入了解这些技术,学习如何在实际项目中应用它们。这个...
4. **数据库设计**: 系统的数据库设计包括多个关键表,如`parking_spaces`(车位表)、`vehicles`(车辆表)、`users`(用户表)、`transactions`(交易表)等。这些表之间可能存在一对一、一对多或多对多的关系,...
6. 事务(Transactions): Redis支持原子性的事务操作,使用`multi`、`exec`进行批处理: ```java jedis.multi(); jedis.set("key1", "value1"); jedis.set("key2", "value2"); List<Object> results = ...
- **Transactions表**:记录每笔交易,包括交易ID、卡号、交易金额、时间等。 系统交互部分,可能采用Swing或JavaFX库来构建用户界面,提供友好的图形化操作。用户可以通过输入卡号和密码登录,然后查看余额、交易...
例如,"accounts"表可能存储账户信息,"transactions"表记录所有收入和支出,而"budgets"表则用于设定和跟踪预算。 系统可能还使用了Spring框架进行依赖注入和管理,以简化开发和测试过程。Spring JDBC或MyBatis等...
java原始博客交易API 这是具有两个功能的AWS Lambda + API Gateway + DynamoDB项目,使用框架构建和部署。 这是为了支持上的系列。 用法 详细设置Serverless Framework和您的AWS账户。 部署Lambda bash-3.2$ git ...
这个系统由Java编程语言实现,采用C/S(客户端/服务器)架构,适合小型超市等零售业进行日常运营和管理。 Java作为一种多平台兼容的编程语言,具有强大的功能和优秀的性能,特别适用于开发这种跨平台的业务应用。...
学习Java需要掌握的技术包括Java Server Page、Java Servlet、Enterprise JavaBean、JDBC、Transactions、JAXP等XML相关技术、Java Message Service、Java Mail、JDO等。其他Management Technologies、Connector ...