在Java中举办事务处理惩罚的要领
副标题#e#
摘要 本文先容在Java中举办事务处理惩罚的要领,通过实例别离报告了如何回收JavaBean、Ejb组件实现J2EE应用处事器支持的JDBC事务、JTA(Java Transaction API)事务。
要害词 JavaBean,EJB, 数据库,事务处理惩罚,JTA
JavaBean
JavaBean是用Java语言编写的与平台无关的组件。它是描写Java的软件组件模子,有点雷同于Microsoft的COM组件的观念。在Java模子中,通过JavaBean可以无限扩充Java措施的成果,通过JavaBean的组合可以快速的生成新的应用措施。JavaBean可以实现代码的反复操作,对付措施的易维护性也有重大的意义。非可视化的JavaBean,在JSP措施中常用来封装事务逻辑、数据库操纵等,可以很好的实现业务逻辑和前台措施的疏散。JavaBean在处事器端的应用方面表示出了越来越强的生命力。
EJB
EJB技能界说了一组可重用的组件:Enterprise JavaBeans。你可以操作这些组件,像搭积木一样的成立你的漫衍式应用措施。当你把代码写好之后,这些组件就被组合到特定的文件中去。每个文件有一个或多个Enterprise Beans,在加上一些设置参数。最后,这些Enterprise Beans被设置到一个装了EJB容器的平台上。客户可以或许通过这些Beans的home接口,定位到某个beans,并发生这个beans的一个实例。这样,客户就可以或许挪用Beans的应用要领和长途接口。EJB技能简化了用JAVA语言编写的企业应用系统的开拓、设置和执行。有三种范例的Enterprise beans: Session beans、 entity beans和Message-driven Beans。
事务处理惩罚
信息是任何企事业单元的重要资产,任何企业部分都包括着信息的流入、流出,任何企业部分都节制着某些信息。同时,信息必需在适当的机缘流传给需要的人。并且,信息还需要安详约束,凡是按照信息的范例和内容实施会见节制。为了担保数据的安详有效和正确靠得住,数据库打点系统(DBMS)必需提供统一的数据掩护成果。
事务是现代数据库理论中的焦点观念之一。假如一组处理惩罚步调可能全部产生可能一步也不执行,我们称该组处理惩罚步调为一个事务。当所有的步调像一个操纵一样被完整地执行,我们称该事务被提交。由于个中的一部门或多步执行失败,导致没有步调被提交,则事务必需回滚(回到最初的系统状态)。事务必需听从ISO/IEC所拟定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、断绝性(isolation)和耐久性(durability)的缩写。事务的原子性暗示事务执行进程中的任何失败都将导致事务所做的任何修改失效。一致性暗示当事务执行失败时,所有被该事务影响的数据都应该规复到事务执行前的状态。断绝性暗示在事务执行进程中对数据的修改,在事务提交之前对其他事务不行见。耐久性暗示已提交的数据在事务执行失败时,数据的状态都应该正确。
在下面我们罗列一个利用SQL Server数据库举办事务处理惩罚的例子。主表是一个规章制度信息表(bylaw),主要字段有记录编号、标题、作者、书写日期等。两个子表别离是附件表(bylaw_affix)和文本信息表(bylaw_content)。表布局见图1所示。bylaw表的记录编号与bylaw_affix表的记录编号、bylaw_content表的记录编号是对应的,每次对规章制度信息的操纵也就是对这三个表的连系操纵。譬喻要删除规章制度中的一笔记录,假如不利用事务,就大概会呈现这样的环境:第一个表中乐成删除后,数据库溘然呈现意外状况,而第二、三个表中的操纵没有完成,这样,删除操纵并没有完成,甚至已经粉碎数据库中的数据。要制止这种环境,就应该利用事务,它的浸染是:要么三个表都操纵乐成,要么都失败。换句话说,就是保持数据的一致性。所以,为了确保对数据操纵的完整和一致,在措施设计时要充实思量到事务处理惩罚方面的问题。
图1 示例表布局
#p#副标题#e#
Java中的事务处理惩罚
一般环境下,J2EE应用处事器支持JDBC事务、JTA(Java Transaction API)事务、容器打点事务。一般环境下,最好不要在措施中同时利用上述三种事务范例,好比在JTA事务中嵌套JDBC事务。第二方面,事务要在尽大概短的时间内完成,不要在差异要领中实现事务的利用。下面我们罗列两种事务处理惩罚方法。
1、JavaBean中利用JDBC方法举办事务处理惩罚
在JDBC中奈何将多个SQL语句组合成一个事务呢?在JDBC中,打开一个毗连工具Connection时,缺省是auto-commit模式,每个SQL语句都被看成一个事务,即每次执行一个语句,城市自动的获得事务确认。为了能将多个SQL语句组合成一个事务,要将auto-commit模式屏蔽掉。在auto-commit模式屏蔽掉之后,假如不挪用commit()要领,SQL语句不会获得事务确认。在最近一次commit()要领挪用之后的所有SQL会在要领commit()挪用时获得确认。
#p#分页标题#e#
public int delete(int sID) {
dbc = new DataBaseConnection();
Connection con = dbc.getConnection();
try {
con.setAutoCommit(false);// 变动JDBC事务的默认提交方法
dbc.executeUpdate("delete from bylaw where ID=" + sID);
dbc.executeUpdate("delete from bylaw _content where ID=" + sID);
dbc.executeUpdate("delete from bylaw _affix where bylawid=" + sID);
con.commit();//提交JDBC事务
con.setAutoCommit(true);// 规复JDBC事务的默认提交方法
dbc.close();
return 1;
}
catch (Exception exc) {
con.rollBack();//回滚JDBC事务
exc.printStackTrace();
dbc.close();
return -1;
}
}
2、SessionBean中的JTA事务
JTA 是事务处事的 J2EE 办理方案。本质上,它是描写事务接口(好比 UserTransaction 接口,开拓人员直接利用该接口可能通过 J2EE 容器利用该接口来确保业务逻辑可以或许靠得住地运行)的 J2EE 模子的一部门。JTA 具有的三个主要的接口别离是 UserTransaction 接口、TransactionManager 接口和 Transaction 接口。这些接口共享民众的事务操纵,譬喻 commit() 和 rollback(), 可是也包括非凡的事务操纵,譬喻 suspend(),resume() 和 enlist(),它们只呈此刻特定的接口上,以便在实现中答允必然水平的会见节制。譬喻,UserTransaction 可以或许执行事务分别和根基的事务操纵,而 TransactionManager 可以或许执行上下文打点。
应用措施可以挪用UserTransaction.begin()要领开始一个事务,该事务与应用措施正在个中运行的当前线程相关联。底层的事务打点器实际处理惩罚线程与事务之间的关联。UserTransaction.commit()要领终止与当前线程关联的事务。UserTransaction.rollback()要领将放弃与当前线程关联的当前事务。
public int delete(int sID) {
DataBaseConnection dbc = null;
dbc = new DataBaseConnection();
dbc.getConnection();
UserTransaction transaction = sessionContext.getUserTransaction();//得到JTA事务
try {
transaction.begin(); //开始JTA事务
dbc.executeUpdate("delete from bylaw where ID=" + sID);
dbc.executeUpdate("delete from bylaw _content where ID=" + sID);
dbc.executeUpdate("delete from bylaw _affix where bylawid=" + sID);
transaction.commit(); //提交JTA事务
dbc.close();
return 1;
}
catch (Exception exc) {
try {
transaction.rollback();//JTA事务回滚
}
catch (Exception ex) {
//JTA事务回滚堕落处理惩罚
ex.printStackTrace();
}
exc.printStackTrace();
dbc.close();
return -1;
}
}