この記事は Spring トランザクション管理の概要 (コード付き) です。必要な方は参考にしていただければ幸いです。
操作の論理的なグループ。操作の各部分は成功または失敗します。
一貫性: トランザクションの前後のデータ整合性は一貫性を保ちます
原子性: トランザクションは分割できず、すべて成功するかすべて失敗します
分離: トランザクションの実行は他のトランザクションの影響を受けず、相互に分離されます
永続性: トランザクションは完了するとデータベースに保存され、影響を受けませんシステムによるクラッシュの影響
分離によって発生する問題:
ダーティ リード: トランザクションは、他のトランザクションによってコミットされていないデータを読み取ります。
Non-repeatable read: トランザクションは、他のトランザクションによって送信されたデータを読み取りますUpdate データにより、複数回一貫性のないクエリ結果が発生します。
ファントム読み取り: 1 つのトランザクションが、別のトランザクション から挿入 データを読み取るため、一貫性のないクエリ結果が発生します。複数回
操作損失
int ISOLATION_DEFAULT = -1; int ISOLATION_READ_UNCOMMITTED = 1; int ISOLATION_READ_COMMITTED = 2; int ISOLATION_REPEATABLE_READ = 4; int ISOLATION_SERIALIZABLE = 8;
ISOLATION_DEFAULT: 春のデフォルト値を表し、基礎となるデータベースのデフォルト分離レベルが使用されることを示します。たとえば、mysql は ISOLATION_REPEATABLE_READ を使用し、ISOLATION_READ_COMMITTEDを使用します
ISOLATION_READ_UNCOMMITTED: コミットされていない読み取り、読み取りの問題を解決できません
ISOLATION_READ_COMMITTED: コミットされた読み取り、解決できますダーティな問題読み取り、ファントム リードと非反復読み取りは解決できません
ISOLATION_REPEATABLE_READ: 反復読み取り、ダーティー リードと非反復読み取りは解決できます
PlatformTransactionManager はインターフェイスです。 Spring オブジェクトの最下層でトランザクションを管理するために使用されます。
public interface PlatformTransactionManager { TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; void commit(TransactionStatus status) throws TransactionException; void rollback(TransactionStatus status) throws TransactionException; }
spring things 公式 Web サイトのアドレスより一般的な実装クラスは次のとおりです:
Transaction定義: トランザクションを定義できます。 関連情報、トランザクションの伝播動作、分離レベル、タイムアウト情報、読み取り専用かどうか
package org.springframework.transaction; //可以看到事物的定义也是一个接口 public interface TransactionDefinition { //事物的传播行为,7种 int PROPAGATION_REQUIRED = 0; int PROPAGATION_SUPPORTS = 1; int PROPAGATION_MANDATORY = 2; int PROPAGATION_REQUIRES_NEW = 3; int PROPAGATION_NOT_SUPPORTED = 4; int PROPAGATION_NEVER = 5; int PROPAGATION_NESTED = 6; //事物的隔离级别五种 int ISOLATION_DEFAULT = -1; int ISOLATION_READ_UNCOMMITTED = 1; int ISOLATION_READ_COMMITTED = 2; int ISOLATION_REPEATABLE_READ = 4; int ISOLATION_SERIALIZABLE = 8; //事物的超时时间,-1代表没有超时时间 int TIMEOUT_DEFAULT = -1; int getPropagationBehavior(); int getIsolationLevel(); int getTimeout(); boolean isReadOnly(); String getName(); }
トランザクションステータス: レコード管理トランザクションプロセス トランザクションステータスのオブジェクト
公式サイトポータル前提条件:
メソッドB()内でメソッドA()を呼び出す
操作がトランザクション内の同じ
PROPAGATION_SUPPORTS: B が A を呼び出します。A にトランザクションがある場合は、A のトランザクションが使用されます。 A にトランザクションがない場合、B はそのトランザクションを使用しません
PROPAGATION_MANDATORY: A にトランザクションがある場合は、A のトランザクションを使用します。A にトランザクションがない場合は、例外がスローされます
トランザクション内の操作が同じ
PROPAGATION_NOT_SUPPORTED: A にトランザクションがあり、A は一時停止されており、B はそのトランザクションを使用していません
*PROPAGATION_NEVER: A にトランザクションがあり、B がスローされる例外
Spring は 2 つのトランザクション管理メソッドを提供します
トランザクション管理のプログラミング: コードベースのトランザクション処理では、プログラムにコードを記述する必要があります
xml に基づく
<!--配置事务管理器--> <bean id="trancationManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" > <property name="dataSource" ref="dataSource" ></property> </bean> <!--配置事务--> <tx:advice id="myAdvice" transaction-manager="trancationManager"> <tx:attributes> <!--配置事务传播和事务隔离--> <tx:method name="save*" propagation="REQUIRED" isolation="REPEATABLE_READ"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="delete*" propagation="REQUIRED"/> <tx:method name="find*" read-only="true"/> <tx:method name="*" propagation="REQUIRED" /> </tx:attributes> </tx:advice> <!--事务是利用aop实现的--> <aop:config> <aop:pointcut id="ponitcut" expression="execution(* com.amber.xml.service.AccountServiceImpl.transferMoney(..))"></aop:pointcut> <aop:advisor advice-ref="myAdvice" pointcut-ref="ponitcut" /> </aop:config>
<!--配置事务管理器--> <bean id="trancationManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" > <property name="dataSource" ref="dataSource" ></property> </bean> <!--开启注解事务--> <tx:annotation-driven transaction-manager="trancationManager" />
使用tx:annotation-driven 开启事务的注解后,在使用的时候只需要在类或者方法上加入@Transactional就可以开启注解
文件配置对比
事务基于注解简化了xml中的
使用比较
使用注解必须在类或者方法上添加@Trasactional,如果有多个业务类,则需要在每个业务类上添加
使用xml只需要在配置文件中配置包名即可
以上がSpring トランザクション管理の関連概要 (コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。