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事务就可以了。