基本概念
事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功。
事务类型
JDBC事务
JDBC事务是用 Connection 对象控制的。JDBC Connection 接口( java.sql.Connection )提供了两种事务模式:自动提交
与手工提交
。java.sql.Connection 提供了以下控制事务的办法:
public void setAutoCommit(boolean)
public boolean getAutoCommit()
public void commit()
public void rollback()
使用 JDBC 事务界定时,可以将多个 SQL 语句结合到一个事务中。JDBC 事务的一个缺点是事务的范围局限于一个数据库连接。一个 JDBC 事务无法跨越多个数据库。
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;
}
}
JTA(Java Transaction API)事务
JTA是一种高层的,与编写无关的,与协议无关的API,应用程序与应用服务器可以使用JTA来访问事务。
JTA允许应用程序执行分布式事务处理--在两个或多个网络计算机资源上访问并且更新数据,这些数据可以分布在多个数据库上。JDBC驱动程序的JTA支持极大地增强了数据访问能力。
如果计划用JTA界定事务,那么就需要有一个编写javax.sql.XADataSource
javax.sql.XAConnection
与javax.sql.XAResource
接口的 JDBC 驱动程序。一个编写了这些接口的驱动程序将可以参与JTA事务。一个XADataSource
对象就是一个XAConnection
对象的工厂。XAConnection s
是参与 JTA 事务的 JDBC 连接。
您将需要用应用服务器的管理工具设置 XADataSource
。从应用服务器与 JDBC 驱动程序的文档中可以了解到相关的指导。
J2EE 应用程序用 JNDI 查询数据源。一旦应用程序找到了数据源对象,它就调用 javax.sql.DataSource.getConnection()
以获得到数据库的连接。
XA连接
与非XA连接
区别。一定要记住 XA 连接参与了 JTA 事务。这意味着 XA 连接不支持 JDBC 的自动提交功能。同时,应用程序一定不要对 XA 连接调用java.sql.Connection.commit()
或者java.sql.Connection.rollback()
。相反,应用程序应该使用 UserTransaction.begin()
、UserTransaction.commit()
与serTransaction.rollback()
。
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;
}
}
容器事务
容器事务主要是J2EE应用服务器提供的,容器事务大多是基于JTA完成,这是一个基于JNDI的,相当复杂的API编写。相对编码编写JTA事务管理,我们可以通过EJB容器提供的容器事务管理机制(CMT)完成同一个功能,这项功能由J2EE应用服务器提供。这使得我们可以简单的指定将哪个办法加入事务,一旦指定,容器将负责事务管理任务。这是我们土建的解决方式,因为通过这种方式我们可以将事务代码排除在逻辑编码之外,同时将所有困难交给J2EE容器去解决。使用EJB CMT的另外一个好处就是程序员无需关心JTA API的编码,不过,理论上我们必须使用EJB。
三种事务差异
- JDBC事务控制的局限性在一个数据库连接内,但是其使用简单。
- JTA事务的功能强大,事务可以跨越多个数据库或多个DAO,使用也比较复杂。
- 容器事务,主要指的是J2EE应用服务器提供的事务管理,局限于EJB应用使用。
网友评论