Spring 데이터베이스 사무 관리 깊이
5653 단어 ⊹●spring
1. @ Transactional 의 실효 문제
1. 정적 (static) 방법 과 비 Public 방법 에 대해 주 해 는 @ Transactional 이 유효 하지 않 습 니 다.
2. 자체 호출 은 하나의 방법 으로 자신의 다른 방법 을 호출 하 는 과정 이다.다음 과 같다.
@Autowired
private RoleDao roleDao;
@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_COMMITTED)
public int insertRole(Role role){
return roleDao.insertRole(role);
}
@Override
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
public int insertRoleList(List roleList) {
int count = 0;
for (Role role:roleList) {
try {
// ,
insertRole(role);
count++;
}catch (Exception ex){
log.info(ex);
}
}
return count;
}
분석: 캐릭터 삽입 은 두 번 모두 같은 사 무 를 사용 합 니 다. 즉, insert Role 방법 에 표 시 된 @ Transactional 이 효력 을 잃 었 습 니 다.AOP 의 실현 원리 때 문 이 며, 여기 서 더 이상 군말 하지 않 는 다.해결: ① 두 가지 서비스 유형 을 사용한다.[추천]
@Service
public class RoleServiceImpl implements RoleService {
@Autowired
private RoleDao roleDao;
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_COMMITTED)
public int insertRole(Role role) {
return roleDao.insertRole(role);
}
}
② IOC 용기 에서 RoleService 대리 대상 을 가 져 옵 니 다.[추천 하지 않 습 니 다. 용기 에서 대리 대상 을 가 져 오 는 것 은 침입 혐의 가 있 습 니 다. 저 희 는 SpringIOC 용기 에 의존 해 야 합 니 다]@Override
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
public int insertRoleList(List roleList) {
int count = 0;
// RoleService ,
RoleService roleService = ctx.getBean(RoleService.class);
for (Role role:roleList) {
try {
insertRole(role);
count++;
}catch (Exception ex){
log.info(ex);
}
}
return count;
}
2. 전형 적 인 오류 용법
1. 서비스 오류 사용
장면: 하나의 Controller 에 두 개의 캐릭터 를 삽입 하고 두 캐릭터 는 같은 업무 에서 처리 해 야 합 니 다.
오류 코드:
public class RoleController {
@Autowired
private RoleService roleService;
public void errorUseServices(){
Role role = new Role();
role.setRoleName("role_name_");
role.setNote("note_");
roleService.insertRole(role);
Role role2 = new Role();
role2.setRoleName("role_name_2");
role2.setNote("note_2");
roleService.insertRole(role2);
}
}
분석: 이 서비스 가 @ Transactional 로 표시 되면 하나의 사 무 를 사용 하고 하나의 service 방법 이 완성 되면 이 사 무 를 풀 어 주기 때문에 앞 뒤 두 개의 insert Role 은 두 개의 서로 다른 업무 에서 이 루어 집 니 다.이렇게 하면 첫 번 째 삽입 이 성공 하고 두 번 째 삽입 이 실패 하면 데이터베이스 데이터 베 이 스 를 완전히 성공 하지 못 하거나 실패 하여 심각 한 데이터 불일치 문제 가 발생 할 수 있 습 니 다.2. 오 랜 시간 사용
장면: 캐릭터 를 삽입 한 후에 그림 업로드 와 같은 파일 을 조작 해 야 합 니 다.
코드:
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_COMMITTED)
public int insertRole(Role role) {
//return roleDao.insertRole(role);
int result = roleDao.insertRole(role);
//
doSomethingForFile();
return result;
}
분석: insertRole 방법 이 끝 난 후에 야 Spring 은 데이터베이스 사무 자원 을 방출 할 수 있 습 니 다. 즉, doSomethingForFile () 방법 이 실 행 된 후에 result 로 돌아 간 후에 야 데이터베이스 자원 을 닫 을 수 있 습 니 다.높 은 병발 상황 에서 카드 상태 가 나타 나 고 심지어 데이터 베이스 자원 을 얻 지 못 해 시스템 이 다운 되 기도 한다.해결: 이 방법 은 controller 에서 실 행 됩 니 다.
@RequestMapping("/addRole")
@ResponseBody
public Role addRole(Role role){
roleService.insertRole(role);
//
doSomethingForFile();
return role;
}
3. 오류 포착 이상
장면: 상품 구 매.그 중에서 ProductService 는 제품 서비스 류 이 고 TransactionService 는 거래 정 보 를 기록 하 는 것 이다. 수 요 는 제품 의 재고 감소 와 거래 를 같은 사무 사례 에 저장 하 는 것 이다. 동시에 성공 하거나 동시에 실패 하 는 것 이다.만약 에 전파 행위 가 모두 REQUIRED 라 고 가정 하면
코드:
@Autowired
private ProductService productService;
@Autowired
private TransactionService transactionService;
@Override
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
public int doTransaction(TransactionBean trans){
int result = 0;
try {
//
productService.decreaseStock(trans.getProductId, trans.getQuantity());
//
if(result>0){
transactionService.save(trans);
}
}catch (Exception ex){
//
//
log.info(ex);
}
return result;
}
분석: 여기 서 문 제 는 방법 에 이상 이 존재 한 다 는 것 이다. 개발 자가 Spring 의 사무 약속 을 모 르 기 때문에 두 가지 조작 방법 에 자신의 try. catch.. 문 구 를 넣 으 면 이런 결과 가 발생 할 수 있다. 재 고 를 줄 이 는 데 성 공 했 지만 거래 정 보 를 보관 하 는 데 실패 하여 이상 이 발생 했다.추 가 된 try. catch.. 문구 로 인해 Spring 은 데이터베이스 사무소 가 약정 한 절차 에서 더 이상 이상 이상 이상 정 보 를 얻 지 못 합 니 다. 이때 Spring 은 업 무 를 제출 합 니 다. 아, 이렇게 하면 재고 가 줄 어 들 고 거래 기록 은 없 는 나 쁜 상황 이 발생 합 니 다.해결: catch 에서 자체 적 으로 이상 을 던 지면 Spring 의 트 랜 잭 션 절 차 를 모 으 면 이 이상 을 포착 하여 트 랜 잭 션 스크롤 백 을 진행 합 니 다.
@Autowired
private ProductService productService;
@Autowired
private TransactionService transactionService;
@Override
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
public int doTransaction(TransactionBean trans){
int result = 0;
try {
//
productService.decreaseStock(trans.getProductId, trans.getQuantity());
//
if(result>0){
transactionService.save(trans);
}
}catch (Exception ex){
//
//
log.info(ex);
// , Spring ,
throw new RuntimeException(ex);
}
return result;
}