데이터를 읽기 위해 데이터베이스 트랜잭션이 필요합니까?
데이터베이스에서 데이터를 읽으려고 할 때 적어도 다음을 사용합니다.
((Session)em.getDelegate()).createCriteria()
예외는 트랜잭션이 존재하지 않는다는 것을 나타내는 던지기입니다.
주석을 추가할 때:
@Transactional(
value = SomeClass.TRANSACTIONAL_MANAGER,
propagation = Propagation.SUPPORTS,
readOnly = true
)
잘 작동합니다.
하지만, 데이터에 접근하고 읽기 위해 초당 수백만 번의 읽기가 발생하기 때문에, 저는 우리의 환경이 불필요하게 막히지 않도록 하고 싶습니다.
그렇지 않은 경우 읽기 전용을 만드는 데 드는 비용은 얼마입니까?Propagation.Supports거래?
트랜잭션 없이 Spring과 함께 최대 절전 모드 기준 쿼리를 만들 수 없습니까?
트랜잭션 경계(BEGIN/COMMIT/ROLLback)를 명시적으로 선언하지 않은 경우에도 모든 데이터베이스 문은 실제 트랜잭션의 컨텍스트 내에서 실행됩니다.
각 문은 autocommit모드). 환경에서 스레드별 연결 바인딩을 처리할 수 없는 경우 문당 하나의 연결을 열거나 닫을 수도 있습니다.
를 서스를다로 합니다.@Transactional에서는 전체 트랜잭션 기간 동안 하나의 연결을 제공하며 모든 문은 해당 단일 분리 연결을 사용합니다.이것은 애초에 명시적인 트랜잭션을 사용하지 않는 것보다 훨씬 낫습니다.
대규모 응용프로그램에서는 여러 개의 동시 요청이 있을 수 있으며, 데이터베이스 연결 획득 요청 속도를 줄이면 전체 응용프로그램 성능이 확실히 향상됩니다.
JPA는 읽기 작업에 트랜잭션을 적용하지 않습니다.트랜잭션 컨텍스트를 시작하는 것을 잊어버린 경우 쓰기만 수행됩니다.그럼에도 불구하고 읽기 전용 트랜잭션의 경우에도 트랜잭션 경계를 선언하는 것이 좋습니다(봄에).@Transactional에서는 읽기 전용 트랜잭션을 표시할 수 있으므로 성능 면에서 큰 이점이 있습니다.
이선적트션예경계잭랜언제예경(계:▁(aries)를 사용하면 다음과 .@Transactional), 실행할 JDBC 문이 있을 때까지 데이터베이스 연결 획득이 지연되는지 확인해야 합니다.JTA에서는 이것이 기본 동작입니다.RESOURCE_LOCAL을 사용하는 경우 구성 속성을 설정하고 기본 연결 풀이 자동 커밋 모드를 사용하지 않도록 설정되었는지 확인해야 합니다.
J2EE에서 JPA를 구현한 경험에 따르면 데이터 무결성을 유지하기 위해 Rollback을 보장함으로써 CRUD 작업 안전을 수행하기 위해 트랜잭션 관리자가 항상 필요합니다.
엔터프라이즈 응용 프로그램은 다양한 리소스를 사용하여 데이터를 저장하고 데이터베이스 또는 메시지 대기열과 같은 메시지를 보냅니다.이러한 리소스를 순차적으로 쿼리하고 문제가 발생하면 전체 작업을 취소하려면 이 쿼리를 작업 단위에 넣어 전체적으로 실행해야 합니다.
정의할 수 있습니다.
관련 주석(질문에 표시된 것처럼)을 사용하여 컨테이너는 주어진 지속성 컨텍스트에 대한 트랜잭션 관리자를 자동으로 로드합니다.
다음과 같이 트랜잭션 관리자를 수동으로 주입합니다.
public class sample { @PersistenceContext EntityManager em; // Injected transaction manager @Inject UserTransaction utx; private static final String[] GAME_TITLES = { "Super Mario Brothers", "Mario Kart", "F-Zero" }; private void clearData() throws Exception { utx.begin(); em.joinTransaction(); System.out.println("Dumping old records..."); em.createQuery("delete from Game").executeUpdate(); utx.commit(); } private void insertData() throws Exception { utx.begin(); em.joinTransaction(); System.out.println("Inserting records..."); for (String title : GAME_TITLES) { Game game = new Game(title); em.persist(game); } utx.commit(); // clear the persistence context (first-level cache) em.clear(); } // ... }
스프링 데이터는 JPA 규격 구현과 동일한 접근 방식을 따를 수 있습니다.
자세한 내용은 Java_Persistence/Transactions 기사를 참조하십시오.
언급URL : https://stackoverflow.com/questions/26327274/do-you-need-a-database-transaction-for-reading-data
'programing' 카테고리의 다른 글
| JavaScript에서 상위 Iframe에 액세스하는 방법 (0) | 2023.08.10 |
|---|---|
| 정적 C 라이브러리에 어떤 기능이 있는지 확인합니다. (0) | 2023.08.10 |
| 하나의 거대한 .css 파일과 여러 개의 더 작은 특정 .css 파일? (0) | 2023.08.05 |
| 열 정수 값을 날짜 식으로 변환 (0) | 2023.08.05 |
| 모델/테이블 별칭이 작동하지 않음(내부 조인) (0) | 2023.08.05 |