春には、データベースのトランザクションはPlatformTransactionManager管理によって行われ、jdbcTemplateは、トランザクションをサポートすることはできません、そして、それは春のトランザクションマネージャは、テンプレート提供org.springframework.transaction.support.TransactionTemplateテンプレートですトランザクションをサポートすることができます
•事務を作成し、コミットやロールバックがPlatformTransactionManagerインターフェイスによって行われます。
異常なトランザクションはトランザクションをロールバックする場合•、すべての例外は、デフォルトの実装にロールバックされます。何らかの異常が発生したり、設定することによって、トランザクションをロールバックしていない場合我々は、ロールバックを変更することができます。
•異常が、トランザクションをコミットしていません。
JTAトランザクションのサポートは、一般的に使用されるDataSourceTransactionManagerは、それが抽象トランザクションマネージャAbstractPlatformTransactionManagerを継承し、AbstractPlatformTransactionManagerはPlatformTransactionManagerを達成しました。春はあなたには、参照、作成、トランザクションをコミットまたはロールバックする方法のPlatformTransactionManagerインターフェイスのソースコードとしてそれを使用できるように。
トランザクションマネージャの設定
トランザクション・マネージャのほとんどのMyBatisのフレームは、従って、この実施形態は、以下に説明する、DataSourceTransactionManager(org.springframework.jdbc.datasource.DataSourceTransactionManager)です。あなたが永続化フレームワークにHibernateを使用している場合は、春-ORMパッケージorg.springframework.orm.hibernate4.HibernateTransactionManagerを使用する必要があります。彼らは我々が使用する一般的には、トランザクションのXML名前空間に参加する、非常に同じです。トランザクションマネージャを設定するには、次の
<?XMLバージョン= '1.0'エンコーディング= 'UTF-8' ?> < 豆のxmlns = "http://www.springframework.org/schema/beans" のxmlns:XSI = "http://www.w3.org/2001 / XMLスキーマ・インスタンス" のxmlns:P = "http://www.springframework.org/schema/p" のxmlns:AOP = "http://www.springframework.org/schema/aop" のxmlns:TX =" HTTP: //www.springframework.org/schema/tx」のxmlns:コンテキスト= "http://www.springframework.org/schema/context" のxsi:schemaLocationの =" http://www.springframework.org/schema/beansのhttp ://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/aopます。http:/ /www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/contextのhttp:/ /www.springframework.org/schema/context/spring-context-4.0.xsd」> <! - 数据库连接池- > < 豆ID = "データソース" クラス= "org.apache.commons.dbcp.BasicDataSource" > < プロパティ名= "driverClassName" 値= "com.mysql.cj.jdbc.Driver" /> < プロパティ名= "URL" 値= "JDBCます。mysql:// localhostを:3306 / springmvc useSslオプション= falseを&#038; serverTimezone =香港&#038; characterEncoding = UTF-8&#038;自動再=本当?" /> < プロパティ名= "ユーザ名" 値= "ルート" /> < プロパティ名前= "パスワード" 値= "123456" /> < プロパティ名= "MAXACTIVE" 値= "255" /> < プロパティ名= "maxIdle" 値= "5" /> < プロパティ名= "MAXWAIT"値= "10000" /> </ 豆> < 豆ID = "jdbcTemplate" クラス= "org.springframework.jdbc.core.JdbcTemplate" > < プロパティ名= "データソース" REF = "データソース" /> </ 豆> <! - 配置数据源事务管理器- - > < ビーンID = "のTransactionManager" クラス= "org.springframework.jdbc.datasource.DataSourceTransactionManager" > < プロパティ名= "データソース" REF = "データソース" /> </ 豆> </ 豆>
ここでは、最初のXML名前空間を導入し、DataSourceTransactionManagerは、データベースのトランザクションマネージャを定義するために使用されるので、その後、データベース接続プールを定義し、データベース接続プールを注入しました。春ので、私はあなたのTransactionManagerが管理トランザクションマネージャにデータベーストランザクションを委任する必要があります知っています。jdbcTemplateソースコード解析、著者はその生産性を指摘しており、経営者が、データベース管理者、jdbcTemplateに委託しますが、この時間は、トランザクションマネージャに委託されているので、データベースとトランザクションリソースがjdbcTemplateされていない場合は、データベースのリソースを解放するときトランザクションマネージャによって処理されます。
あなたはそれが冗長性を生成するので、コードの可読性が悪く、今はほとんどプログラムによるトランザクションを春に宣言的トランザクションまたはプログラムによるトランザクションを使用しない、とすることができます。宣言型トランザクションは、XML構成と注釈情勢に分けることができますが、XMLはまた、現在主流の方法は@Transactional注釈されている方法を使用していません。
春のJavaに構成されたデータベーストランザクションを実装
春のJava構成データベースのトランザクションを達成するための方法、annota-tionDrivenTransactionManagerは、インターフェイスコンフィギュレーションTransactionManagementConfigurerクラスのメソッドを実装する必要があります。春はannotationDrivenTransactionManagerメソッドは、トランザクションマネージャプログラムとしてトランザクションマネージャを返します
リスト:春の物事を達成するためにJavaデータベース・コンフィギュレーションを使用して
パッケージcom.ssm.chapter13.config。 輸入org.apache.commons.dbcp.BasicDataSourceFactory; 輸入org.springframework.context.annotation.Bean。 輸入org.springframework.context.annotation.ComponentScan; 輸入org.springframework.context.annotation.Configuration。 輸入org.springframework.jdbc.core.JdbcTemplate。 輸入org.springframework.jdbc.datasource.DataSourceTransactionManager。 輸入org.springframework.transaction.PlatformTransactionManager。 輸入org.springframework.transaction.annotation.EnableTransactionManagement。 インポートorg.springframework.transaction.annotation.TransactionManagementConfigurer; インポートするjavax.sql.DataSource; インポートjava.util.Properties; @Configuration (@ComponentScanは。 "com.ssm.chapter13 *は" ) // イベント駆動型マネージャを使用 @EnableTransactionManagement パブリック クラスをさんJavaConfigに実装TransactionManagementConfigurer { // データソース のプライベートデータソースのdataSource = ヌル; / ** 。*コンフィギュレーション・データ・ソース* @return 。データソース * / @Bean(名前 = "データソース" ) 公衆データソースinitDataSource(){ 場合(!のdataSource = nullは){ 返すDataSourceを。 } プロパティの小道具 = 新しいプロパティ(); props.setProperty( "driverClassName"、 "com.mysql.cj.jdbc.Driver" ); props.setProperty( "URL"、 "JDBCます。mysql:// localhostを:?3306 / springmvc useSslオプション=偽&serverTimezone =香港&characterEncoding = UTF-8&自動再=真" ); props.setProperty( "ユーザ名"、 "ルート" )。 props.setProperty( "パスワード"、 "123456" );); props.setProperty( "maxIdle"、 "20" )。 props.setProperty( "MAXWAIT"、 "30000" )。 試す{ データソース = BasicDataSourceFactory.createDataSource(小道具)。 } キャッチ(例外e){ e.printStackTrace(); } 戻りデータソースを、 } / ** *配置jdbcTemplate * @return jdbcTemplate * / @Bean(名前 = "jdbcTemplate"= New新しい; JdbcTemplate() jdbcTemplate.setDataSource(initDataSource()); を返すjdbcTemplate; } / ** *インタフェースのメソッドは、そのようなリターンを実現するデータベース・トランザクション・マネージャ * / @Override @Bean(名前 = "のTransactionManager" ) 公共PlatformTransactionManager annotationDrivenTransactionManager( ){ DataSourceTransactionManagerでのTransactionManager = 新しい新しいDataSourceTransactionManager(); // データソースは、トランザクション・マネージャが管理提供 transactionManager.setDataSource(initDataSource()); 戻りのTransactionManagerを; } }
TransactionManagementConfigurerインタフェースは、メソッド定義された注釈DrivenTransactionManagerを実装し、我々は、トランザクション・マネージャにDataSourceTransactionManager定義データベース・インスタンスを使用して、データ・ソースは、それに提供されます。Springコンテキストにおけるトランザクションの注釈@注釈@EnableTransactionManagement、使用トランザクションを使用して、春には、データベースのトランザクションマネージャが業務を管理して使用することを知っていることに注意してください。
プログラムによるトランザクション
コードを介してプログラムによるトランザクション管理サービスは、他の言葉で、トランザクションは、我々だけでデフォルトの実装を使用して、トランザクション定義のクラスインタフェース--TransactionDefinition、一時的ではないの深い導入を使用する必要性、開発者自身のコードによって達成されますクラス--DefaultTransactionDefinitionこと。
リスト:プログラムによるトランザクション
パッケージcom.ssm.chapter13.main。 輸入org.springframework.context.ApplicationContext; 輸入org.springframework.context.support.ClassPathXmlApplicationContext; 輸入org.springframework.jdbc.core.JdbcTemplate。 輸入org.springframework.transaction.PlatformTransactionManager。 輸入org.springframework.transaction.TransactionDefinition。 輸入org.springframework.transaction.TransactionStatus。 輸入org.springframework.transaction.support.DefaultTransactionDefinition。 パブリック クラスMainTest { 公共 静的 ボイドメイン(文字列[]引数){ ApplicationContextのCTX = 新しい ClassPathXmlApplicationContext( "SSM /第13章/スプリングcfg.xmlを")。// CTX为春のIoC容器 JdbcTemplate jdbcTemplate = ctx.getBean(JdbcTemplate クラス)。 // 事务定义类 TransactionDefinition DEF = 新しいDefaultTransactionDefinition(); PlatformTransactionManagerのTransactionManager = ctx.getBean(PlatformTransactionManager クラス)。 TransactionStatusステータス = transactionManager.getTransaction(DEF)。 試す{ // 执行SQLを语句 jdbcTemplate.update(+ "値( 'role_name_transactionManager'、 'note_transactionManager')" "(t_roleにROLE_NAME、音符)を挿入" )。 // 提交事务 transactionManager.commit(ステータス)。 } キャッチ(例外例){ // 回滚事务 transactionManager.rollback(ステータス)。 } } }
それが終了すると、INSERT文を実行するようにするには、jdbcTemplate独自のデータベース・リソース管理はトランザクションマネージャによってされているので、トランザクションは、トランザクション・マネージャの管理を手渡したため、すべてのトランザクションは、開発者自身の制御によって行われているコードから見ることができます実際にコミット、この方法では、トランザクションマネージャをコミット使用、およびトランザクションのロールバック方法をロールバックする必要はありませんが必要です。
それは、使用してもほとんど非推奨メソッド主流の方法ではありませんので、もちろん、これは使用する最も簡単な方法は、あるそれは、プログラムのコードフロー明確な理解がトランザクションの未来に貢献紹介するので、理由があります。
プログラムによるトランザクション・タイプは、トランザクションをロールバックする必要がある、データベーストランザクションを使用した場合、ほとんどの場合には、シーンのほとんどは、コードに異常が発生したが、取引契約で異常がリスクなしであるとき、トランザクションがコミットされますデータベース内のデータの一貫性を確保するように。