2012-03-10 23 views
12

私はJDBCでSpringを使用しており、それが自動コミットであることがわかりました。Spring + JDBCで自動コミットを無効にするにはどうすればよいですか?

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> 

答えて

14

を私の設定は、この行を逃したようだ:

その後
<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()は1もロールバックされます。

私は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。 2018:しかし、これはあなたが別のクラスを作成する必要がある理由REQUIRES_NEWを、使用したい場合は

アップデートを(そうでなければ、本当に新しいトランザクションを作成しませんREQUIRES_NEWを思わこの問題Spring Transaction propagation REQUIRED, REQUIRES_NEWを、取得する)ことを説明されていません-01-01:私はSpring Boot 1.5.8で完全な例を作成しました。ここでのリリースhttps://www.surasint.com/spring-boot-database-transaction-jdbi/ と基本的な実験例はこちらhttps://www.surasint.com/spring-boot-connection-transaction/

+0

これはSpringのトランザクションマネージャが自動コミットをオフにして独自のコミットを行うために機能しましたか? – Raedwald

2

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

TransactionTemplate template = new TransactionTemplate(txManager); 

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

ありがとうございました。より大きな画像をサポートするために、Springは単純なjdbcの複雑さを増やしています。 :) –

+0

@SurasinTancharoen:まあ、実際にはありません。私はセットアップ*するのが最も簡単だと言いましたが、使用しないようにしました。 '@ Transactional'やAOPを使うと、コードの変更を最小限に抑えて、1つのトランザクション内で複数行のコードを実行することができます。 –

+0

私はちょうどこれを読んでいます。http://www.ibm.com/developerworks/java/library/j-ts2/index.html "Springとのプログラムによるトランザクション"を代替することはできますか? –

6

はdefaultAutoCommitプロパティを試してみてください。コードは次のようになります。javadocツールで

<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" /> 

ルック: http://commons.apache.org/dbcp/apidocs/org/apache/commons/dbcp/BasicDataSource.html#defaultAutoCommit

関連する問題