Spring のトランザクション制御は、プログラム的トランザクション制御と宣言的トランザクションに分けられます。 ### コントロール。
プログラマティック
開発者はトランザクション コードとビジネス コードを直接結合しますが、実際の開発では使用されません。宣言的
開発者は構成を使用してトランザクション制御を実現し、ビジネス コードとトランザクション コードを分離し、AOP アイデアを使用します。 2. プログラムによるトランザクション制御関連オブジェクト2.1PlatformTransactionManagerPlatformTransactionManager インターフェイスは Spring のトランザクション マネージャー インターフェイスであり、トランザクションを操作するためによく使用されるメソッドを提供します。2.2TransactionDefinition
分離レベルを設定すると、ダーティ リードなど、トランザクションの同時実行によって引き起こされる問題を解決できます。繰り返し読み取りおよび仮想読み取り(ファントム読み取り)。
注: データベースのデフォルト レベルを使用します。データベースが mysql の場合、デフォルトは反復読み取り、Oracle は読み取りコミットです。
ISOLATION_DEFAULTデータベースのデフォルト レベルを使用します
コミットされていない読み取り
コミットされた読み取り (解決できます)ダーティ リードの問題)
反復可能読み取り (ダーティ リードと非反復可能読み取りの問題を解決できます)
シリアル化
# (2) トランザクション伝播動作
# トランザクション伝播動作とは何を指しますかビジネス メソッドが別のビジネス メソッドによって呼び出されたときにトランザクション制御をどのように実行するかが関係します。
#重要なポイント:
##読み取り専用
(読み取り専用かどうか): クエリを実行するときは読み取り専用に設定することをお勧めします。timeout
2.3 TransactionStatus
3 つの関係は簡単に理解できます。トランザクション マネージャーは、トランザクション定義パラメーターを読み取ることでトランザクション管理を実行し、一連のトランザクション状態を生成します。
Spring のトランザクション制御は主に次の 3 つの API を通じて実装されます
PlatformTransactionManager
はトランザクションの管理を担当します。これはインターフェイスであり、そのサブクラスは特定の作業を担当しますTransactionDefinition トランザクションの関連パラメータを定義します
TransactionStatus 実行中のトランザクションのリアルタイムのステータスを表します
トランザクション マネージャーは、
トランザクション定義パラメータ
トランザクション ステータスを生成します。 3. XMLベースの宣言型トランザクション制御 【ポイント】 トランザクションをコード処理ではなくSpring設定ファイル内で宣言的に処理します。最下層は AOP のアイデアを使用して実装されています。
トランザクション拡張コード (Springトランザクション マネージャーが提供されています)) (誰に通知されますか?)
アスペクトの設定 (アスペクトの設定方法) (アスペクト = ポイントカット通知)3.1 クイック スタート Spring の宣言型トランザクション制御転送ビジネスを使用します。 #手順:1.tx 名前空間の導入
2.トランザクション マネージャー通知構成3.トランザクション マネージャー AOP 構成
4. トランザクション制御転送ビジネス コードのテスト
(1)tx 名前空間の導入
<?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:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.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 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd ">
(2)トランザクション マネージャー通知設定
<!--事务管理器对象--> <!--<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>--> // 通知增强 <tx:advice id="txAdvice" transaction-manager="transactionManager"> //定义事务的一些属性 * 表示当前任意名称的方法都走默认配置 <!-- name: 切点方法名称 isolation:事务的隔离级别 propagation:事务的传播行为 read-only:是否只读 timeout:超时时间 --> <tx:attributes> <tx:method name="transfer" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" timeout="-1"/> //CRUD常用配置 <tx:method name="save*" propagation="REQUIRED"/> <tx:method name="delete*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="find*" read-only="true"/> <tx:method name="*"/> </tx:attributes> </tx:advice>
(3)トランザクション マネージャー AOP の構成
//aop配置:配置切面 <aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.lagou.servlet.impl.AccountServiceImpl.*(..))"/> </aop:config>-->
##
name
:切点方法名称
isolation
:事务的隔离级别
propogation
:事务的传播行为
timeout
:超时时间
read-only
:是否只读
步骤:
修改service层,增加事务注解
修改spring核心配置文件,开启事务注解支持
@Service public class AccountServiceImpl implements AccountService { @Autowired private AccountDao accountDao; @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.REPEATABLE_READ, timeout = -1, readOnly = false) @Override public void transfer(String outUser, String inUser, Double money) { accountDao.out(outUser, money); int i = 1 / 0; accountDao.in(inUser, money); } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w2.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" 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/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!--省略之前datsSource、jdbcTemplate、组件扫描配置--> <!--事务管理器--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!--事务的注解支持--> <tx:annotation-driven/> </beans
核心配置类:
@Configuration // 声明该类为核心配置类 @ComponentScan("com.lagou") // 包扫描 @Import(DataSourceConfig.class) //导入其他配置类 @EnableTransactionManagement //事务的注解驱动 public class SpringConfig { @Bean public JdbcTemplate getJdbcTemplate(@Autowired DataSource dataSource){ JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); return jdbcTemplate; } @Bean public PlatformTransactionManager getPlatformTransactionManager(@Autowired DataSource dataSource){ DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(dataSource); return dataSourceTransactionManager; } }
数据源配置类:
@PropertySource("classpath:jdbc.properties") //引入properties文件 public class DataSourceConfig { @Value("${jdbc.driverClassName}") private String driver; @Value("${jdbc.url}") private String url; @Value("${jdbc.username}") private String username; @Value("${jdbc.password}") private String password; @Bean //会把当前方法的返回值对象放进IOC容器中 public DataSource getDataSource(){ DruidDataSource druidDataSource = new DruidDataSource(); druidDataSource.setDriverClassName(driver); druidDataSource.setUrl(url); druidDataSource.setUsername(username); druidDataSource.setPassword(password); return druidDataSource; } }
以上がJava Spring の 2 種類のトランザクションとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。