- プログラムによるトランザクション:プログラマーはトランザクション制御コードをプログラムします
- 宣言型トランザクション:トランザクション制御コードはSpringによって記述されています。プログラマーは、トランザクション制御が必要なメソッドとトランザクション制御の実行方法を宣言するだけで済みます。
- 宣言型トランザクションはすべて、ServiceImplクラスのメソッドを対象としています。
- 通常、マッパーインターフェイスでメソッドを管理するために、Springまでに管理する必要のあるメソッドを構成します。
- アドバイスに基づいて、最下層はメソッドに基づいてアドバイスクラスを生成し、このクラスのトランザクションの前にトランザクションを開始し、トランザクションの後にコミットまたはロールバックします(mybatisのフィルターopenSeesionInviewの機能を置き換えます)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--代替mybatis中的mybatis.xml的功能 -->
<!--数据源 -->
<context:property-placeholder location="classpath:db.properties"/>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!--相当于mabatis中的工厂,spring帮助进行创建工厂
typeAliasesPackage标签相当于mybatis的typeAliases标签,类名可以简写-->
<bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="typeAliasesPackage" value="cn.wit.pojo"></property>
</bean>
<!--相当于mappers标签 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.wit.mapper"></property>
<property name="sqlSessionFactoryBeanName" value="factory"></property>
<!-- <property name="sqlSessionFactory" ref="factory"></property> -->
</bean>
<!--spring进行事务管理的类 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource"></property>
</bean>
<!--配置声明式事务,本质上是切点的通知 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="ins*"/>
<tx:method name="del*"/>
<tx:method name="upd*"/>
<tx:method name="*" readonly="true"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut expression="execution(* cn.wit.serviceImpl.*.*(..))" id="mypoint"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="mypoint"/>
</aop:config>
</beans>
name = ""
- トランザクション制御が必要なメソッド、サポート*ワイルドカード
readonly =” boolean”
- 読み取り専用トランザクションであるかどうか、trueの場合は、トランザクションが読み取り専用トランザクションであることをデータベースに通知します。データの最適化によりパフォーマンスが向上するため、クエリメソッドである限り、このデータを使用することをお勧めします。 。false(デフォルト値)の場合、トランザクションをコミットする必要があります。追加、削除、変更することをお勧めします。
伝播制御トランザクション伝播動作
- トランザクション制御を備えたメソッドがトランザクション制御を備えた別のメソッドによって呼び出された場合、トランザクションをどのように管理する必要がありますか(新しいトランザクションを作成しますか?トランザクションで実行しますか?トランザクションを一時停止しますか?例外を報告しますか?)
- 必須(デフォルト):現在トランザクションがある場合は、トランザクションで実行します。現在トランザクションがない場合は、新しいトランザクションを作成します。
- サポート:現在トランザクションがある場合はトランザクションで実行され、現在トランザクションがない場合は非トランザクション状態で実行されます
- 必須:トランザクション内で実行する必要があります。現在のトランザクションがある場合はトランザクション内で実行されます。トランザクションがない場合はエラーが報告されます。
- REQUIRES_NEW:トランザクションで実行する必要があります。現在トランザクションがない場合は、新しいトランザクションを作成します。現在のトランザクションがある場合は、現在のトランザクションを一時停止します。
- NOT_SUPPORTED:非トランザクションで実行する必要があります。現在トランザクションがない場合は通常どおり実行し、現在のトランザクションがある場合は現在のトランザクションを一時停止します
- 決して:非トランザクション状態で実行する必要があります。現在トランザクションがない場合は正常に実行します。現在トランザクションがある場合はエラーが報告されます。
- NESTED:トランザクション状態で実行する必要があります。トランザクションがない場合は新しいトランザクションを作成し、現在トランザクションがある場合はネストされたトランザクションを作成します。
- Isolation =””トランザクション分離レベル、マルチスレッドまたは同時アクセスでアクセスされたデータの整合性を確保する方法。
トランザクション分離レベルの分離
- デフォルト:デフォルト値であり、基盤となるデータベースが使用する分離レベルを自動的に決定します
- READ_UNCOMMITTED:コミットされていないデータの読み取り、ダーティ読み取り、非反復読み取り、およびファントム読み取りが発生する可能性があります
- READ_COMMITTED:送信されたデータのみを読み取ることができ、ダーティ読み取りは発生しません
- REPEATABLE_READ:読み取られたデータは、他のトランザクションがこのデータを変更できないようにロックされているため、繰り返し不可能な読み取りを防ぐことができます。ダーティ読み取り、ファントム読み取りが発生する可能性があります。
- SERIALIZABLE:キュー操作、テーブル全体へのロックの追加トランザクションがデータを操作している場合、別のトランザクションはトランザクション操作が完了するのを待ってからこのテーブルを操作します
ダーティリード
トランザクションAは、トランザクションBによってコミットされていないデータを読み取ります(READ_COMMITTEDは、読み取りキャッシュを禁止することで解決できます)
繰り返し不可
トランザクションAがデータを読み取った後、データはトランザクションBによって変更されます(変更操作、REPEATABLE_READは、対応するデータをロックすることで解決できます)
ファントムリーディング
トランザクションAはデータを照会し、トランザクションBは追加または削除します(ファントム読み取りの削除では1つのデータのみをロックでき、テーブル全体をSERIALIZABLEでロックする必要があります)
トランザクションロールバックロールバック-
- 何か異常が発生した場合はロールバックする必要があります
- rollback-for =”異常なタイプの完全修飾パス”
- 提案:属性値を与える
- 手動で例外をスローするには、属性値を指定する必要があります。
- no-rollback-for =””
- 何か異常が発生したときにトランザクションをロールバックしないでください。