web-dev-qa-db-ja.com

Spring + JDBCで自動コミットをオフにするように構成するにはどうすればよいですか?

私はJDBCでSpringを使用していますが、自動コミットであることがわかりました。

Spring-servlet.xmlでオフにするように構成するにはどうすればよいですか?

これは私の現在の設定です:

<bean id="dataSource"
    class="org.Apache.commons.dbcp.BasicDataSource" destroy-method="close"
    p:driverClassName="${jdbc.driverClassName}"
    p:url="${jdbc.databaseurl}" p:username="${jdbc.username}"
    p:password="${jdbc.password}" />

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

私の設定はこの行を逃したようです:

<tx:annotation-driven transaction-manager="txManager"/>

次に、サービスクラスで@Transactionalアノテーションを使用します。例えば

@Service
class CompanyServiceImpl implements CompanyService{
    @Autowired
    private CompanyDAO companyDAO;

    @Transactional
    public void addCompany(Company company) {
            companyDAO.addCompany(company); // in here, there is JDBC sql insert
            companyDAO.addCompany_fail(company); // just for test
    }
}

AddCompany_fail()で例外が発生している場合、最初のaddCompany()もロールバックされます。

私はこのドキュメントに従って、Springでトランザクションがどのように制御されるかを理解しました。 http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html

このドキュメントに従って、SpringでJDBCを使用してコーディングする方法を理解しました。 http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/jdbc.html

私もこれを読みます(無料) http://www.infoq.com/news/2009/04/Java-transaction-models-strategy 。本当にいいものです。そして私は、ほとんどの人がトランザクションについて理解していない(または気にしていない)という作家と同じように感じています。

PS:そのようなHibernate/Springフレームワークの使用は、JDBCとトランザクション制御の複雑さを回避するためだけであると多くの人が誤解しているようです。多くの人は「JDBCとトランザクションは非常に複雑です。Hibernateを使用して、これら2つについては忘れてください」と考えています。 Spring + HibernateまたはSpring + JDBCに関するインターネット上の多くの例は、トランザクションにまったく関心がないようです。これは悪い冗談だと思います。トランザクションは、本当に理解せずに何かを処理させるだけでは深刻です。

HibernateとSpringは非常に強力で複雑です。そして、誰かが言ったように、「大きな力には責任が伴います」。

更新:2013-08-17:ここにトランザクションに関する良い例があります http://www.byteslounge.com/tutorials/spring -transaction-propagation-tutorial 。ただし、これは、REQUIRES_NEWを使用する場合に別のクラスを作成する必要がある理由を説明していません(そうしないと、この問題が発生します Spring Transactionの伝播REQUIRED、REQUIRES_NEW 、REQUIRES_NEWは実際には作成しないようです新しいトランザクション)

更新:2018-01-01:Spring Boot 1.5.8で完全な例を作成しました。ここでリリースします https:// www .surasint.com/spring-boot-database-transaction-jdbi / といくつかの基本的な実験の例 https://www.surasint.com/spring-boot-connection-transaction/

15

DefaultAutoCommitプロパティを試してください。コードは次のようになります。

<bean id="dataSource"
class="org.Apache.commons.dbcp.BasicDataSource" destroy-method="close"
p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.databaseurl}" p:username="${jdbc.username}"
p:password="${jdbc.password}"
p:defaultAutoCommit="false" />

Javadocを見てください: http://commons.Apache.org/dbcp/apidocs/org/Apache/commons/dbcp/BasicDataSource.html#defaultAutoCommit

6
kapeloland

トランザクション内でコードを実行するだけではできません。Springは自動コミットを自動的に無効にします。 Springのトランザクションでコードを実行する最も簡単な(少なくともセットアップする)方法は、 TransactionTemplate を使用することです。

TransactionTemplate template = new TransactionTemplate(txManager);

template.execute(new TransactionCallback<Object>() {
  public Object doInTransaction(TransactionStatus transactionStatus) {
    //ALL YOUR CODE ARE BELONG TO... SINGLE TRANSACTION
  }
}
2