java事务管理
什么是事务:
事务,就是一组操作数据库的动作集合。
一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务。当所有的步骤像一个操作一样被完整地执行,我们称该事务被提交。由于其中的一部分或多步执行失败,导致没有步骤被提交,则事务必须回滚到最初的系统状态。
事务必须满足ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)的缩写。
事务的原子性表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。一致性表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。隔离性表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。持久性表示当系统或介质发生故障时,确保已提交事务的更新不能丢失。持久性通过数据库备份和恢复来保证。
Java中的事务处理
一般J2EE服务器支持三种类型的事务管理。即:JDBC事务,JTA事务,容器管理事务。
最好不要在程序中同时使用上述三种事务类型;并且,事务要在尽可能短的时间内完成,不要在不同方法中实现事务的使用。下面举两个例子说明JDBC及JTA事务,容器管理事务是在特定的框架中实现的(如:Spring的事务管理)
1. JDBC事务
public String delete(String id) {
String ID = id;
db = new getConnection();
Connection con = db.getConnection();
try {
con.setAutoCommit(false);
db.executeUpdate("delete from helloworld where ID=" + ID); //更新操作1
db.executeUpdate("delete from helloworld _book where ID=" + ID); //更新操作2
db.executeUpdate("delete from helloworld_user where ID=" + ID); //更新操作3
con.commit();//提交JDBC事务
con.setAutoCommit(true);
db.close();
return “success”;
}catch (Exception e) {
con.rollBack();//回滚JDBC事务
e.printStackTrace();
db.close();
return “fail”;
}
}
如上例:更新操作1,2,3只有当三步操作都成功完成才进行提交,否则回滚已经进行的操作。这样,保证了数据的完整性,不会因为突然断电等特殊情况导致的数据错误。
2.JTA事务
JTA是J2EE事务服务的解决方案、描述了J2EE模型事务接口。JTA具有三个主要的接口:UserTransaction、TransactionManager、Transaction接口。这些接口共享公共的事务操作,如:commit()、rollback()。同时各自也有自己的操作。举例说明:
public String delete(String id) {
String ID = id;
db = new getConnection();
db.getConnection();
UserTransaction transaction = sessionContext.getUserTransaction();//获得JTA事务
try {
transaction.begin(); //开始JTA事务
db.executeUpdate("delete from helloworld where ID=" + ID);
db.executeUpdate("delete from helloworld _book where ID=" + ID);
db.executeUpdate("delete from helloworld _user where ID=" + ID);
transaction.commit(); //提交JTA事务
db.close();
return”success”;
} catch (Exception e) {
try {
transaction.rollback();//事务回滚
}catch (Exception e) {
e.printStackTrace();
}
exc.printStackTrace();
db.close();
return “fail”;
}
}
3.容器事务管理
在Spring、Hibernate等框架中都有各自的事务管理功能。虽然表现形式有些差别,但都是在JAVA事务管理的基础上实现的。这里不进行介绍。