1

Spring でトランザクションがどのように機能するかを学ぶための簡単なアプリケーションを作成しようとしています (宣言型 AOP スタイル)。顧客テーブルに 1 つのレコードを挿入し、NullPointerException をスローして、挿入されたデータがロールバックされるかどうかを確認しています。しかし、驚いたことに、データをロールバックしていません。ここにコードがあります

ApplicationContext.xml ファイル

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="

    http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
    http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
    ">

<aop:aspectj-autoproxy />

<bean id="BoardingService" class="com.learning.maven.services.BoardingServiceImpl"/>

<tx:advice id="txAdvice" transaction-manager="transactionManager" >
    <tx:attributes>
        <tx:method name="getUser*" rollback-for="throwable" propagation="REQUIRES_NEW"/>
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut id="boardingServiceOperation" expression="execution(* com.learning.maven.services.BoardingService.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="boardingServiceOperation"/>
</aop:config>

<bean id="transactionManager"  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
    <property name="url" value="jdbc:oracle:thin:@localhost:1521:XE"/>
    <property name="username" value="system"/>
    <property name="password" value="Manager"/>
</bean>

<bean id="customerDAO" class="com.learning.maven.dao.CustomerDAOImpl">
    <property name="dataSource" ref="dataSource" />
</bean>

これが私がメソッドを呼び出す方法です

public static void main(String[] args) {

    context = new FileSystemXmlApplicationContext("C:\\workspace\\learning\\cxf\\SpringTransaction\\cxf.xml");
    BoardingService bean = (BoardingService) context.getBean("BoardingService");
    bean.getUser("1");

}

そして、BoardingService クラスは以下のようになります

public class BoardingServiceImpl implements BoardingService, ApplicationContextAware {

    ApplicationContext context = null;

    public String getUser(String id) {

        String response = "SUCCESS";
        try{
            System.out.println("Testing");
            CustomerDAO customerDAO = (CustomerDAO) Testing.context.getBean("customerDAO");

            Customer c = new Customer();
            c.setAge(31);
            c.setCustId(1);
            c.setName("Jagadeesh");


            customerDAO.insert(c);

            customerDAO.insert(null);
        }
        catch(Exception e){
            throw new RuntimeException();
        }

        return response;
    }

    @Override
    public void setApplicationContext(ApplicationContext arg0)
            throws BeansException {
        this.context = arg0;

    }

および CustomerDAOImpl

private DataSource dataSource;

public void setDataSource(DataSource dataSource) {
    this.dataSource = dataSource;
}

public void insert(Customer customer) {

    String sql = "INSERT INTO CUSTOMER (CUST_ID, NAME, AGE) VALUES (?, ?, ?)";
    Connection conn = null;

    try {
        conn = dataSource.getConnection();
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setInt(1, customer.getCustId());
        ps.setString(2, customer.getName());
        ps.setInt(3, customer.getAge());
        ps.executeUpdate();
        ps.close();

    } catch (SQLException e) {
        throw new RuntimeException(e);

    } finally {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {}
        }
    }       
}

public Customer findByCustomerId(int custId) {
    // TODO Auto-generated method stub
    return null;
}

どこが間違っているのかわかりません。どんなポインタでも大いに役立ちます。

4

2 に答える 2

0

ロールバックがあります-"throwable"代わりに"Throwable".

REQUIRES_NEWPSデフォルトの戦略として使用する必要があるかどうかわからない。

更新DataSourceTransactionManagerドキュメントから

標準のJ2EEスタイルのDataSource.getConnection()呼び出しではなく、DataSourceUtils.getConnection(DataSource)を介してJDBC接続を取得するには、アプリケーションコードが必要です。JdbcTemplateなどのSpringクラスは、この戦略を暗黙的に使用します。このトランザクションマネージャーと組み合わせて使用​​しない場合、DataSourceUtilsルックアップ戦略はネイティブのDataSourceルックアップとまったく同じように動作します。したがって、ポータブルな方法で使用できます。

この場合、接続を直接開き、Oracleは閉じるときにトランザクションをコミットします(これはOracle RDBMSの機能です)。

于 2013-01-14T06:29:15.117 に答える
0

rollback-for 属性を省略することもできます。その後、RuntimeException が発生するとロールバックします。

于 2013-01-14T06:52:15.560 に答える