Java 编程 ,事务管理的作用
发布网友
发布时间:2022-04-07 19:28
我来回答
共4个回答
懂视网
时间:2022-04-07 23:49
);
现在可以使用通常的方法创建一个语句对象:
Statement stat = conn.createStatement();
然后任意多次调用executeUpdate方法:
stat.executeUpdate(command1);
stat.executeUpdate(command2);
stat.executeUpdate(command3);
...
如果执行了所有命令之后没有出错,则调用commit方法:
conn.commit();
如果出现错误,则调用:
conn.rollback();
此时,程序将自动撤销自上次提交以来的所有语句。当事务被SQLException异常中断时,典型的方法就是发起回滚操作。
1. 保存点
在使用某些驱动程序时,使用保存点(save point)可以更细粒度地控制回滚操作。创建一个保存点意味着稍候只需返回到这个点,而非事务的开头。例如,
Statement stat = conn.createStatement(); //开启一个事务;rollback()返回这里
stat.executeUpdate(command1);
Savepoint svpt = conn.setSavepoint(); //设置保存点;rollback(svpt)返回到这里
stat.executeUpdate(command2);
if(...) conn.rollback(svpt); //撤销command2产生的影响
...
conn.commit();
当不再需要保存点时,必须释放它:
conn.releaseSavepoint(svpt);
2. 批量更新
假设有一个程序需要执行许多INSERT语句,以便将数据填入数据库表中,此时可以使用批量更新的方法来提高程序性能。在使用批量更新(batch update)时,一个语句序列作为一批操作将同时被收集和提交。
注意:使用DatabaseMetaData接口中的supportsBatchUpdates方法可以获知数据库是否支持这种特性。
处于同一批中的语句可以是INSERT、UPDATE和DELETE等操作,也可以是数据库定义语句,如CREATE TABLE和DROP TABLE。但是,在批量处理中添加SELECT语句会抛出异常(从概念上讲,批量处理中的SELECT语句没有意义,因为它会返回结果集,而不更新数据库)。
为了执行批量处理,首先必须使用通常的办法创建一个Statement对象:
Statement stat = conn.createStatement();
现在应该调用addBatch方法,而非executeUpdate方法:
String command = "CREATE TABLE..."
stat.addBatch(command);
while(...){
command = "INSERT INTO ... VALUES("+...+")";
stat.addBatch(command);
}
最后,提交整个批量更新语句:
int[] counts = stat.executeBatch();
调用executeBatch方法将为所有已提交的语句返回一个记录数的数组。
为了在批量模式下正确地处理错误,必须将批量执行的操作视为单个事务。如果批量更新在执行过程中失败,那么必须将它回滚到批量操作开始之前的状态。
首先,关闭自动提交模式,然后收集批量操作,执行并提交该操作,最后恢复最初的自动提交模式:
boolean autoCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
Statement stat = conn.getStatement();
...
//keep calling stat.addBatch(...);
...
stat.executeBatch();
conn.commit();
conn.setAutoCommit(autoCommit);
Java数据库编程——事务
标签:
热心网友
时间:2022-04-07 20:57
事务就是对一系列的数据库操作进行统一的提交或回滚操作,比如说做一个转账功能,要更改帐户两边的数据,这时候就必须要用事务才能算是严谨的做法。要么成功,要么失败,保持数据一致性。如果中间有一个操作出现异常,那么回滚之前的所有操作。
这样有什么好处呢。
这样可以防止在一些意外(例如说突然断电)的情况下出现乱数据,防止数据库数据出现问题。这边加了钱,那边却还是一样的数,这就完了。要是开放一个网上交易的平台,这样就会出大问题的!
还有其他的一些操作,像是要添加多条数据,如果程序要求必须全部正确才能插入的话,事务又起大作用了。
等等。。。开发中为了避免这种情况一般都会进行事务管理。
在JDBC中是通过Connection对象进行事务管理的,默认是自动提交事务,可以手工将自动提交关闭,通过commit方法进行提交,rollback方法进行回滚,如果不提交,则数据不会真正的插入到数据库中。
Hibernate中是通过Transaction进行事务管理,处理方法与JDBC中类似。
Spring中也有自己的事务管理机制,使用TransactionMananger进行管理,可以通过Spring的注入来完成此功能。
热心网友
时间:2022-04-07 22:15
---------------------------------------------------------
这个问题我以前回答过别人的,请参考http://zhidao.baidu.com/question/191543132.html
有不明白的地方,直接百度HI 我吧
Spring提供的事务管理可以分为两类:编程式的和声明式的。
编程式的,比较灵活,但是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活方便。
1、传统使用JDBC的事务管理
以往使用JDBC进行数据操作,使用DataSource,从数据源中得到Connection,我们知道数据源是线程安全的,而连接不是线程安全的,所以对每个请求都是从数据源中重新取出一个连接。一般的数据源由容器进行管理,包括连接池。例如TOMCAT,WEBSPHERE,WEBLOGIC等这些J2EE商业容器都提供了这个功能。
以往的我们使用JDBC在写代码时,事务管理可能会是这样:
Connection conn = null;
try{
conn = DBConnectionFactory.getConnection;
conn.setAutoCommit(false);
//do something
conn.commit(); //commit transcation
}catch(Exception e){
conn.rollback();
}
finally{
try{
conn.close();
} catch(SQLException se){ //do sth.}
//close ResultSet,PreparedStatement,Connection
//notice:Maybe ocurr Exception when u close rs,pstmt,conn
}
按照以往的思路来写代码,代码量比较长,而且容易疏忽,忘掉一些try/catch,引发一些异常无法catch,虽然有时候我们会写DBTool类,来关闭这些资源,并且保证在关闭这些资源时,不向外抛异常,但是这样做会导致额外的麻烦。
2、Spring提供的编程式的事务处理
Spring提供了几个关于事务处理的类:TransactionDefinition //事务属性定义
TranscationStatus //代表了当前的事务,可以提交,回滚。
PlatformTransactionManager这个是spring提供的用于管理事务的基础接口,其下有一个实现的抽象类AbstractPlatformTransactionManager,我们使用的事务管理类例如DataSourceTransactionManager等都是这个类的子类。
我们使用编程式的事务管理流程可能如下:
(1) 声明数据源。
(2) 声明一个事务管理类,例如:DataSourceTransactionManager,HibernateTransactionManger,JTATransactionManager等
(3) 在我们的代码中加入事务处理代码:
TransactionDefinition td = new TransactionDefinition();
TransactionStatus ts = transactionManager.getTransaction(td);
try{
//do sth
transactionManager.commit(ts);
}catch(Exception e){transactionManager.rollback(ts);}
使用Spring提供的事务模板TransactionTemplate:
void add()
{
transactionTemplate.execute( new TransactionCallback(){
pulic Object doInTransaction(TransactionStatus ts)
{ //do sth}
}
}
TransactionTemplate也是为我们省去了部分事务提交、回滚代码;定义事务模板时,需注入事务管理对象。
3、Spring声明式事务处理
Spring声明式事务处理也主要使用了IoC,AOP思想,提供了TransactionInterceptor*和常用的代理类TransactionProxyFactoryBean,可以直接对组件进行事务代理。
使用TransactionInterceptor的步骤:
(1)定义数据源,事务管理类
(2)定义事务*,例如:
<bean id =
热心网友
时间:2022-04-07 23:50
Java种运用了大量的事务管理,就是对一系列的数据库操作进行统一的提交或回滚操作,比如说做一个转账功能,要更改帐户两边的数据,这时候就必须要用事务才能算是严谨的做法。要么成功,要么失败,保持数据一致性。如果中间有一个操作出现异常,那么回滚之前的所有操作。
在strut2框架中为了避免多个用户同时访问服务器,都会使用事务管理来管理访问的人数。