在数据访问层中如何应用事务处理相关的技术及应用示例

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在数据访问层中如何应用事务处理相关的技术及应用示例

1.1.1如何在数据访问逻辑组件中应用事务处理相关的技术

1、J2EE规范中的事务划分的两种模式

(1)声明性事务(declarative)

(2)编程性事务(programmatic)

2、编程性事务的具体实现

事务处理的功能,基本上有两种选择:使用基于JDBC连接的事务、使用外部框架所提供的事物服务。

(1)使用基于JDBC数据库连接的事务或者Java 事务API(JTA)

事务处理的性能相对比较高,但是,当系统涉及到多个数据库之间的交互时,基于数据库连接的事务便无能为力了-----此时可以采用JTA形式的事务处理技术。

(2)而使用外部框架所提供的事物服务,能够适应更多的应用场合----如Spring框架中的事务支持。

3、DAO组件中的事务划分策略:对ADO中的事务划分有两个主要的策略。

(1)一种方法是使用DAO承担事务的责任-------此时则在DAO类中嵌入事务代码。(2)另一种是延期性事务,它把事务划分到调用DAO对象的方法中(如业务层组件中或者数据访问服务组件中)------此时,我们可以将事务代码写在DAO类的外部。

tx.begin(); // 启动事务

dao.createWarehouseProfile(profile);

dao.updateWarehouseStatus(id1, status1);

dao.updateWarehouseStatus(id2, status2);

mit(); // 结束事务

注意:

个人认为事务不要由DAO组件来处理,而应该由业务组件类或者数据访问服务组件中的方法来处理-----也就是尽可能采用前面的“延期性事务”设计方案。

4、关于事务应该在DAO层还是在DAO 服务层中加以实现的问题

(1)合理地决定事务所在地

DAO中方法的粒度是不同的,如果粒度比较大,每个方法就是实现了一个功能,也就是

一个事务,那么直接在方法开始启动事务,方法结束提交事务就可以了。

如果粒度比较小,那么则需要在DAO层之上再封装一层DAO Service(数据访问服务组件),在数据访问服务组件中调用多个DAO方法来实现,也就是说多个DAO方法在一个事务中执行。这样就需要将事务控制提到DAO外部来进行----也就是放在数据访问服务组件中。(2)尽可能采用声明式事务实现

比如可以采用Spring中的声明式事务实现。

5、事务划分的基本原则

(1)原则一:使事务尽可能短小。

通过使事务尽量短小,我们可以把阻碍其它事务的时间缩到最短,从而提高应用程序的可伸缩性。保持事务尽可能短小的最好方法当然是不在事务中间做任何不必要耗费时间的事,特别是不要在事务中间等待用户输入。

因为事务提供并发控制,这通常意味着资源管理器将代表我们获得我们在事务期间访问的数据项的锁,并且它必须一直持有这些锁,直到事务结束(前面所讨论的 ACID特性,其中“ACID”的“I”代表“隔离”---Isolation,也就是说,一个事务的结果影响不到与该事务并发执行的其它事务)。

当我们拥有锁时,任何需要访问我们锁定的数据项的其它事务将不得不一直等待,直到我们释放锁。如果我们的事务很长,那些其它的所有事务都将被锁定,我们的应用程序吞吐量将大幅度下降。

(2)原则二:在事务期间不要等待用户输入

(3)原则三:把相关操作归到单个事务中,但把不相关的操作放到单独的事务中根据前面的原则一中所要求的事务应尽可能短小,我们必须把一些操作归到一个事务中来维护一致性。

6、JDBC中的事务处理

(1)JDBC中的缺省事务处理方式

为了确保对数据操作的完整和一致,在程序设计时要充分考虑到事务处理方面的问题。在JDBC中怎样将多个SQL语句组合成一个事务?

在JDBC中,打开一个连接对象Connection时,缺省是auto-commit模式,每个SQL 语句都被当作一个事务,即每次执行一个语句,都会自动的得到事务确认。为了能将多个SQL语句组合成一个事务,要将auto-commit模式屏蔽掉。

(2)自定义自己的事务处理要求

在auto-commit模式屏蔽掉之后,如果不调用commit()方法,SQL语句不会得到事务确认。在最近一次commit()方法调用之后的所有SQL会在方法commit()调用时得到确认。(3)代码示例

con.setAutoCommit(false);

PreparedStatement updateSales=con.prepareStatement("UPDATE COFFES SET SALES=? WHERE COF_NAME LIKE ?");

updateSales.setInt(1,50);

updateSales.setString(2,"Colombian");

updateSales.executeUpdate();

PreparedStatement updateTotal=con.prepareStatement("UPDATE COFFEES SET TOTAL =TOTAL+ ? WHERE COD_NAME LIKE ?");

updateTotal.setInt(1,50);

updateTotal.setString(2,"Colombian");

updateTotal.executeUpdate();

mit();

con.setAutoCommit(true);

7、Java 事务API(JTA)

(1)JTA---- Java Transaction API

Java事务API和它的同胞Java事务服务(JTS----Java Transaction Service),为J2EE 平台提供了分布式事务服务。下面为JTS与JTA之间的关系:

相关文档
最新文档