目次
トランザクションの概念:
- トランザクションとは
(1) トランザクションはデータベース操作の最も基本的な単位です。論理的には、一連の操作は成功するか、1 つが失敗するとすべての操作が失敗します。
(2) 典型的なシナリオ: 銀行振込。送金時に 1 つのリンクが失敗した場合、2 人の口座に資金が増えることはなく、同時に成功した場合に限ります。 > - トランザクションの 4 つの特性 (ACID)
(1) 原子性
(2) 一貫性
( 3)絶縁
(4) 耐久性
1. トランザクション運用(トランザクション運用環境の構築)
- データベーステーブルを作成してレコードを追加する
2. サービスを作成し、dao を構築し、オブジェクトを完成させます
@Repository
public class UserDaoImpi implements UserDao{
@Autowired
private JdbcTemplate jdbcTemplate;
//张三给李四转账100
@Override
public void reduceMoney() {
String sql="update account set money=money-? where username=?";
int update = jdbcTemplate.update(sql, 100, "张三");
}
@Override
public void addMoney() {
String sql="update account set money=money+? where username=?";
int update = jdbcTemplate.update(sql, 100, "李四");
}
}
2. トランザクション操作(トランザクションの構築:)
問題: この状況では、一方が送金する際に例外を設けた場合、もう一方は実行しないため、送金する側の所持金は減りますが、もう一方の所持金は増えません。
(1) 上記の問題を解決するにはどうすればよいでしょうか?
(2) トランザクション操作プロセス
3. トランザクション操作 (Spring トランザクション管理の概要)
-
JavaEEの3層構造のサービス層(ビジネスロジック層)にトランザクションを追加
-
春にトランザクション管理操作を実行する
(1) 2 つの方法があります: プログラムによるトランザクション管理 と 宣言型トランザクション管理(使用)
-
ステートメントトランザクション管理
(1) アノテーション方式による実装
(2) XML設定ファイルを基に実装
-
春の宣言型トランザクション管理、下部に AOP 原則を使用
-
Springトランザクション管理API
(1) トランザクション マネージャーを表すインターフェイスを提供します。このインターフェイスは、フレームワークごとに異なる実装クラスを提供します。
トランザクション管理 (注釈付きの宣言型トランザクション管理)
- Spring 構成ファイルでトランザクション マネージャーを構成する
<!-- 创建事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入数据源-->
<property name="dataSource" ref="dataSource" ></property>
</bean>
-
Spring 構成ファイルで、トランザクション アノテーションを有効にします
(1) Spring設定ファイルに名前空間txを導入する
xmlns:tx="http://www.springframework.org/schema/tx"
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
(2) トランザクションアノテーションをオンにする
<!-- 开启事务注解-->
<tx:annotation-driven transaction-manager="transactionManager" ></tx:annotation-driven>
-
サービス クラス (またはサービス クラスのメソッド) にトランザクション アノテーションを追加します
(1) @Transational、このアノテーションはクラスに追加され、方法 a>(2) このアノテーションをメソッドに追加すると、このクラスのすべてのメソッドにトランザクションが追加されます。
(3) このアノテーションをメソッドに追加した場合、このメソッドのトランザクションを追加します
@Service
@Transactional
public class UserService {
操作結果:
例外が発生しましたが、トランザクションはロールバックされ、データベース内の転送量は変化しませんでした。
4. トランザクション操作(宣言型トランザクション管理パラメータ設定)
-
サービスクラスに @transational アノテーションを追加します。このアノテーションでは、トランザクション関連のパラメーターを設定できます。
-
伝播: トランザクションの伝播動作
(1) マルチトランザクションメソッドを直接呼び出します。このプロセスではどのように事務が管理されますか?
トランザクションメソッド: データベースデータを変更する操作
-
iosation: トランザクション分離レベル
(1) トランザクション特性は独立しており、複数トランザクション間の動作には影響がありません。隔離を考慮しないと多くの問題が発生します
(2) 読み取りの問題には、ダーティー・リーディング、ノンリピートリーディング、ファントム(幻影)リーディングの3つがあります。
(3) ダーティ リード: 1 つのコミットされていないトランザクションが、別のコミットされていないトランザクションからデータを読み取ります。
(4) 非反復読み取り: コミットされていないトランザクションは、別のコミットされたトランザクションから変更されたデータを読み取ります。
(5) 仮想読み取り: コミットされていないトランザクションが、送信された別のトランザクションからデータを読み取り、データを追加します。
(6) 解決策: トランザクション分離を設定して読み取りの問題を解決します。
-
タイムアウト: タイムアウト時間
(1) トランザクションは一定期間内に送信する必要があり、送信されない場合はロールバックされます。
(2) デフォルト値は -1 で、設定時間は秒単位で計算されます。
-
readOnly: 読み取り専用かどうか
(1) 読み取り:クエリ操作、書き込み:追加、変更、削除操作
(2) readOnly のデフォルト値は false です。これは、クエリが可能であり、変更および削除操作を追加できることを意味します。
(3) readOnly が True の場合、クエリ操作のみを実行できます。
-
ロールバックの場合: ロールバック
(1) 発生してロールバックされるトランザクション例外はどれですか?
-
noRollbackFor: ロールバックなし
(2) ロールバックされないトランザクション例外はどれですか?
5. トランザクション操作(XML宣言型トランザクション管理方式)
-
Spring構成ファイルで構成する
最初のステップはトランザクション マネージャーを構成することです
ステップ 2 通知を構成する
ステップ 3: エントリ ポイントとアスペクトを構成する
<!-- 2.配置通知--> <tx:advice id="txAdvice"> <!-- 配置参数--> <tx:attributes> <tx:method name="accountMoney" propagation="REQUIRED"/> <!-- 表示以account开头的都可以--> <tx:method name="account*"/> </tx:attributes> </tx:advice> <!-- 3.配置切入点和切面--> <aop:config> <!-- 配置切入点--> <aop:pointcut id="pt" expression="execution(* com.study.service.UserService.*(..))"/> <!-- 配置切面--> <aop:advisor advice-ref="txAdvice" pointcut-ref="pt" /> </aop:config>
6. トランザクション操作 (完全にアノテーション付きの宣言型トランザクション管理)
- 構成クラスを作成し、その構成クラスを使用して XML 構成ファイルを置き換えます
@Configuration //配置类
@ComponentScan(basePackages = "com.study") //组件扫描
@EnableTransactionManagement //开启事务
public class TxConfig {
//创建数据库连接池
@Bean
public DruidDataSource getDruidDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/user");
dataSource.setUsername("root");
dataSource.setPassword("123456");
return dataSource;
}
//创建JdbcTemplate对象
@Bean
public JdbcTemplate getJdbcTemplate(DataSource dataSource) {
//到ioc容器中根据类型找到dataSource
JdbcTemplate jdbcTemplate = new JdbcTemplate();
//注入dataSource
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}
// 创建事务管理器
@Bean
public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource) {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource);
return transactionManager;
}
}