트랜잭션은 일련의 N단계 데이터베이스 작업으로 구성된 논리적 실행 단위입니다. 이 일련의 작업은 모두 실행되거나 모두 중단됩니다.
트랜잭션의 특성: ACID
업데이트 손실의 첫 번째 유형 | 더티 읽기 | 업데이트 손실의 두 번째 유형 | 반복 불가능한 읽기 | 팬텀 읽기 | |
---|---|---|---|---|---|
예 | 예 | 예 | 예 | 예 | |
No | No | 예 | 예 | 예 | |
아니요 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 공유 잠금(S 잠금) : 트랜잭션 A가 특정 데이터에 공유 잠금을 추가한 후 다른 트랜잭션은 해당 데이터에 공유 잠금을 추가할 수만 있고 배타적 잠금은 추가할 수 없습니다
배타적 잠금(X 잠금) : 트랜잭션 A가 특정 데이터에 배타적 잠금을 추가한 후에는 다른 트랜잭션이 이 데이터에 공유 잠금이나 배타적 잠금을 추가할 수 없습니다. | 낙관적 잠금(맞춤형) | 버전 번호, 타임스탬프 등 |
Spring 트랜잭션 관리
선언적 트랜잭션
XML 구성을 통해 메소드의 트랜잭션 특성을 선언합니다.
애노테이션을 통해 메소드의 트랜잭션 특성을 선언합니다.
프로그래밍 방식 트랜잭션
TransactionTemplate을 통해 트랜잭션을 관리하고 이를 통해 데이터베이스 작업을 수행합니다.
5. 예
package com.nowcoder.community.service; import com.nowcoder.community.dao.AlphaDao; import com.nowcoder.community.dao.DiscussPostMapper; import com.nowcoder.community.dao.UserMapper; import com.nowcoder.community.entity.DiscussPost; import com.nowcoder.community.entity.User; import com.nowcoder.community.util.CommunityUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.support.TransactionCallback; import org.springframework.transaction.support.TransactionTemplate; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import java.util.Date; @Service //@Scope("prototype") public class AlphaService { @Autowired private AlphaDao alphaDao; @Autowired private UserMapper userMapper; @Autowired private DiscussPostMapper discussPostMapper; @Autowired private TransactionTemplate transactionTemplate; public AlphaService() { // System.out.println("实例化AlphaService"); } @PostConstruct public void init() { // System.out.println("初始化AlphaService"); } @PreDestroy public void destroy() { // System.out.println("销毁AlphaService"); } public String find() { return alphaDao.select(); } // REQUIRED: 支持当前事务(外部事务),如果不存在则创建新事务. // REQUIRES_NEW: 创建一个新事务,并且暂停当前事务(外部事务). // NESTED: 如果当前存在事务(外部事务),则嵌套在该事务中执行(独立的提交和回滚),否则就会REQUIRED一样. @Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED) public Object save1() { // 新增用户 User user = new User(); user.setUsername("alpha"); user.setSalt(CommunityUtil.generateUUID().substring(0, 5)); user.setPassword(CommunityUtil.md5("123" + user.getSalt())); user.setEmail("alpha@qq.com"); user.setHeaderUrl("https://cache.yisu.com/upload/information/20220823/112/6198.png"); user.setCreateTime(new Date()); userMapper.insertUser(user); // 新增帖子 DiscussPost post = new DiscussPost(); post.setUserId(user.getId()); post.setTitle("Hello"); post.setContent("新人报道!"); post.setCreateTime(new Date()); discussPostMapper.insertDiscussPost(post); Integer.valueOf("abc"); return "ok"; } public Object save2() { transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED); transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); return transactionTemplate.execute(new TransactionCallback<Object>() { @Override public Object doInTransaction(TransactionStatus status) { // 新增用户 User user = new User(); user.setUsername("beta"); user.setSalt(CommunityUtil.generateUUID().substring(0, 5)); user.setPassword(CommunityUtil.md5("123" + user.getSalt())); user.setEmail("beta@qq.com"); user.setHeaderUrl("https://cache.yisu.com/upload/information/20220823/112/6199.png"); user.setCreateTime(new Date()); userMapper.insertUser(user); // 新增帖子 DiscussPost post = new DiscussPost(); post.setUserId(user.getId()); post.setTitle("你好"); post.setContent("我是新人!"); post.setCreateTime(new Date()); discussPostMapper.insertDiscussPost(post); Integer.valueOf("abc"); return "ok"; } }); } }
위 내용은 SpringBoot 트랜잭션 관리 사례 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!