Spring 郁闷我两天了 请大家帮帮忙

09-10-13 zhonglin45
package com.db2;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.springframework.jdbc.core.SqlParameterValue;
import org.springframework.jdbc.core.StatementCreatorUtils;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.dao.InvalidDataAccessApiUsageException;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.SavepointManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

public class SpringDatabaseTest {
private DataSource dataSource = null;
private int fetchSize = 100;
private Map< Long, PreparedStatement > preStateList = new HashMap< Long, PreparedStatement >();
private Connection conn = null;
// トランザクション制御
private PlatformTransactionManager txManager = null;
public static void main( String[] args ) {
SpringDatabaseTest springDatabaseTest = new SpringDatabaseTest();
try{
springDatabaseTest.businessLogic();
}catch( Exception e ){
e.printStackTrace();
}
}
public void businessLogic() {
TransactionStatus serviceTX1 = null;
TransactionStatus serviceTX = null;
try{
setDataSource();
setTxManager();
serviceTX = beginTransaction();
//////////////////////////////////////////////////////////////////////////////

1:我把下面的检索处理加上后,事务回滚不起作用。
2:如果我把检索处理注释掉的话,事务回滚起作用。
问题?
在本程序中,检索处理对事物操作起了什么影响。怎么做才能消除影响??
//////////////////////////////////////////////////////////////////////////////
// 検索処理
ResultSet rs = execute( "SELECT * FROM BASE_TEST", null );
update( "UPDATE BASE_TEST SET INS_DTTM ='www'", null );
rollbackTransaction( serviceTX );
conn.commit();
conn.close();
}catch( Exception e ){
e.printStackTrace();
}
release();
}


protected void setDataSource() {
DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setDriverClassName( "com.ibm.db2.jcc.DB2Driver" );
ds.setUrl( "jdbc:db2://172.31.133.160:51550/MB01" );
ds.setUsername( "mbdbub02" );
ds.setPassword( "mbdbub02" );
this.dataSource = ds;
}


protected void setTxManager() {
DataSourceTransactionManager txManager = new DataSourceTransactionManager();
txManager.setDataSource( this.dataSource );
this.txManager = txManager;
}


protected Connection getConnection() {

boolean isClose = true;
try{
if( conn != null ){
isClose = conn.isClosed();
}
}catch( SQLException e ){
e.printStackTrace();
}
if( this.conn == null || isClose ){
this.conn = DataSourceUtils.getConnection( dataSource );
}

return this.conn;
}


protected int update( String sql, List< SqlParameterValue > params ) {
try{
PreparedStatement ps = prepared( sql, params );

int i = ps.executeUpdate();

ps.close();

return i;
}catch( SQLException e ){
throw new InvalidDataAccessApiUsageException( e.getMessage(), e );
}
}


protected ResultSet execute( String sql, List< SqlParameterValue > params ) {
try{
PreparedStatement ps = prepared( sql, params );

ResultSet rs = ps.executeQuery();

preStateList.put( Long.valueOf( rs.hashCode() ), ps );
return rs;
}catch( SQLException e ){
throw new InvalidDataAccessApiUsageException( e.getMessage(), e );
}
}


private PreparedStatement prepared( String sql, List< SqlParameterValue > params ) {
PreparedStatement ps = null;

try{
conn = getConnection();
// conn.setAutoCommit( false );
// ps = getConnection().prepareStatement( sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE,
// ResultSet.HOLD_CURSORS_OVER_COMMIT );
ps = getConnection().prepareStatement( sql );
if( this.fetchSize > 0 ){
ps.setFetchSize( this.fetchSize );
}
if( params != null ){
for( int i = 0; i < params.size(); i++ ){
SqlParameterValue paramValue = params.get( i );

StatementCreatorUtils.setParameterValue( ps, i + 1, paramValue, paramValue.getValue() );
}
}
}catch( SQLException e ){
throw new InvalidDataAccessApiUsageException( e.getMessage(), e );
}
return ps;
}


public void release() {
try{
for( PreparedStatement ps : this.preStateList.values() ){
ps.close();
}
}catch( SQLException e ){
throw new InvalidDataAccessApiUsageException( e.getMessage(), e );
}
}


/**
* <p>
* トランザクションを開始します。
* </p>
*
* @return トランザクション・ステータス
*/
protected TransactionStatus beginTransaction() {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();

def.setName( "SomeTxName" );
def.setPropagationBehavior( TransactionDefinition.PROPAGATION_REQUIRED );
return this.txManager.getTransaction( def );
}


/**
* <p>
* トランザクションをコミットします。
* </p>
*
* @param status トランザクション・ステータス
*/
protected void commitTransaction( TransactionStatus status ) {
if( status != null && status.isCompleted() == false ){
txManager.commit( status );
}
}


/**
* <p>
* トランザクションをロールバックします。
* </p>
*
* @param status トランザクション・ステータス
*/
protected void rollbackTransaction( TransactionStatus status ) {
if( status != null && status.isCompleted() == false ){
txManager.rollback( status );
}
}

}

zhonglin45
2009-10-13 22:00
Spring 事务方面的资料 那位达人有 希望能共享一下 谢谢
!!!

banq
2009-10-14 09:31
Spring其实没有事务,只不过提供JTA事务的一个切入点。看你代码好像在JDBC这里使用了JTA事务,没有必要,JTA事务一般使用在业务层,这里使用JDBC事务就可以了。