@Transactionalの原理
7077 ワード
@Transactional
スプリングでトランザクションを管理する方法は抽象的です.@Transactionalを使用するとトランザクションが発生するためです.
私はこの魔法の内部を学びました.
Transaction動作原理
JDBC取引のコード
import java.sql.Connection; Connection connection = dataSource.getConnection(); // (1)
try (connection) { connection.setAutoCommit(false);
// (2)
// execute some SQL statements...
connection.commit();
// (3)
} catch (SQLException e)
{ connection.rollback(); // (4)
}
JDBC取引のコード
import java.sql.Connection; Connection connection = dataSource.getConnection(); // (1)
try (connection) { connection.setAutoCommit(false);
// (2)
// execute some SQL statements...
connection.commit();
// (3)
} catch (SQLException e)
{ connection.rollback(); // (4)
}
falseは逆に、事務の主人は私です.つまり、私がコントロールして、欲しい内容に提出したりロールバックしたりします.
これはjdbcの基本トランザクションメソッドであり、javaでトランザクションを開始する唯一のメソッドでもあるため、@Transactionalもそうします.
@Transactional(propagation=TransactionDefinition.NESTED, isolation=TransactionDefinition.ISOLATION_READ_UNCOMMITTED)
重要なのは、トランザクション・独立性レベルが重なる場合の動作と比較して、独立性レベルが次の基本JDBCコードに整理されることです.Spring Transaction Managementの仕組み
プログラミングスタイルのトランザクション管理方法.
@Service
public class UserService {
@Autowired private
TransactionTemplate template;
public Long registerUser(User user) {
Long id = template.execute(status -> {
// SQL 실행
// ex) inserts the user into the db and returns the autogenerated id
return id;
});
}
}
前述したようにTransactionTemplateまたはPlatfromTransactionManagerを直接使用すればよい.これらは指定する必要がある空の値ですが、後で変更する必要はありません.
@Transactional使用時の内部コード
public class UserService {
public Long registerUser(User user) {
Connection connection = dataSource.getConnection(); // (1)
try (connection) { connection.setAutoCommit(false);
// (1)
// execute some SQL that e.g.
// inserts the user into the db and retrieves the autogenerated id
// userDao.save(user); <(2)
connection.commit(); // (1)
} catch (SQLException e) {
connection.rollback();
// (1)
}
}
}
以上のように、@Transactionalは上のオブジェクトを管理するコードを自動的に挿入し、これらのオブジェクトの管理を支援します.上記のように、スプリングがコードを挿入する方法
スプリングは基本的にiocを使用します.
次に、上記のUserServiceをインスタンス化すると、クラスのトランザクションエージェントもインスタンス化されます.このようにCGIBライブラリ(プレゼンテーションエージェントモードでインタフェースクラスのないライブラリを適用)
のヘルプでは、エージェントによってコードを挿入するように動作させます.
すべてのトランザクション(open、commit、close)の処理は、エージェント自体ではなくトランザクションマネージャに委任されます.
1.スプリングが@Transactionalを検出すると、空のダイナミックエージェントが生成されます.
2.エージェント・オブジェクトは、トランザクション・マネージャへのアクセスを要求し、トランザクションまたは接続をオンまたはオフにします.
3.取引マネージャはJDBC方式でコードを提供する.
物理トランザクションと論理トランザクションの違い
@Transactional Propagtion Level
取引の伝播のレベルには多くの種類がある.
その結果、jdbcが入るかどうかを理解するだけでよい.
@Transactional Isolation Level
データベースの分離度は複雑なトピックです.トランザクション中に独立性レベルを切り替える場合は、まずデータベースまたはJDBCドライバがこの機能をサポートしているかどうかを明確にする必要があります.
.エージェントを通過しない場合、すなわちiocに制御権を渡さずに@Transactional付きの内部メソッドを呼び出すと、ioc登録前にrochel時にエージェントが
機能しないため、適用されません.
トランザクション間の孤立度が高いほど、パフォーマンスが低下します.
一般的なオンラインサービスはREAD COMMITTEDまたはREPEATABLE READを使用する.
(oracle = READ COMMITTED, mysql = REPEATABLE READ)
Springとjpa(hibernate)トランザクション管理動作
私はそう思うことができますが、彼ら二人はお互いに知っています.どちらも唯一の方法jdbc基本方式を使用しているからです!
しかし、お互いに認識できるように、スプリングとhyvernateの統合を実現しなければならない.
HibernateTransaction Managerの使用
2つのトランザクション統合の問題を解決するには、DataSourcePlatformTransactionManagerではなくHibernateTransactionManagerを使用します.
JPAでHibernateを使用する場合は、JpaTransactionManagerを使用できます.
HibernateTransaction Managerは直接Hibernateを使用するときにトランザクションを管理し、JpaTransaction Managerはjpaを介して間接的に使用するときにトランザクションを管理します.
事務を管理する.
Spring-boot-start-data-jpaのようなライブラリを使用すると、springは自動的にJpaTransaction Managerを使用します.
整理する
どのテクノロジーを使用しても、JDBCベース(getConnection()、setAutoCommit(false)、commit()です.
コメントサイト
https://jeong-pro.tistory.com/228
Reference
この問題について(@Transactionalの原理), 我々は、より多くの情報をここで見つけました
https://velog.io/@fj2008/Transactional원리
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
Reference
この問題について(@Transactionalの原理), 我々は、より多くの情報をここで見つけました https://velog.io/@fj2008/Transactional원리テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol