Spring 에서 사무 관리의 네 가지 방법(은행 이체 의 경우)
본 고 는 예제 코드 다운로드 주소(완전 실행 가능,sql 파일 포함,다운로드 후 데이터베이스 설정 을 수정 하 십시오):여 기 를 클릭 하여 다운로드
일의 역할
몇몇 데이터 베 이 스 를 하나의 전체 제어 로 하여 함께 성공 하거나 함께 실패 합 니 다.
원자 성:사 무 는 분리 할 수 없 는 업무 단위 로 업무 중의 조작 이 모두 발생 하거나 발생 하지 않 는 다 는 것 을 말한다.
일치 성:업무 전후 데이터 의 완전 성 이 일치 해 야 한 다 는 것 을 말한다.
격 리 성:여러 사용자 가 동시에 데이터 베 이 스 를 방문 할 때 한 사용자 의 업 무 는 다른 사용자 의 사무실 에 의 해 방 해 를 받 지 못 하고 여러 개의 병행 업무 간 의 데 이 터 는 서로 격 리 되 어야 한 다 는 것 을 말한다.
지속 성:하나의 업무 가 제출 되면 데이터 베이스 에 대한 변 화 는 영구적 인 것 이 고 실시 간 데이터 베이스 가 고장 나 도 이에 영향 을 주지 말 아야 한 다 는 것 을 말한다.
2.Spring 사무 관리 고위 층 추상 화 는 주로 3 개의 인 터 페 이 스 를 포함한다.
--Platform TransactionManager 트 랜 잭 션 관리자(제출,스크롤 백 트 랜 잭 션)
Spring 은 서로 다른 지구 화 프레임 워 크 에 서로 다른 Platform TransactionManager 인 터 페 이 스 를 제공 합 니 다.예:
Spring JDBC 또는 iBatis 를 사용 하여 지속 적 인 데 이 터 를 진행 할 때 DataSourceTransactionManager 를 사용 합 니 다.
Hibernate 3.0 버 전 으로 데이터 영구 화 시 HibernateTransactionManager 사용
--TransactionDefinition 트 랜 잭 션 정의 정보(격 리,전파,시간 초과,읽 기 전용)
더러 운 읽 기:한 사 무 는 다른 사 무 를 읽 고 바 꾸 었 으 나 아직 제출 되 지 않 은 데 이 터 를 읽 었 습 니 다.이 데이터 가 스크롤 백 되면 읽 은 데 이 터 는 유효 하지 않 습 니 다.
중복 읽 을 수 없습니다:같은 사무 에서 같은 데 이 터 를 여러 번 읽 고 돌아 오 는 결과 가 다 릅 니 다.
환 독:한 사무 가 몇 줄 의 기록 을 읽 은 후에 다른 사무 가 기록 을 삽입 하면 환 독 이 발생 합 니 다.이후 의 조회 에서 첫 번 째 사 무 는 원래 없 었 던 기록 들 을 발견 할 수 있 을 것 이다.
트 랜 잭 션 격 리 단계:(5 가지)
트 랜 잭 션 전파 행위:(7 가지)
3.Spring 은 다음 과 같은 방법 으로 업 무 를 통제 합 니 다.
a.프로 그래 밍 식 사무 관리(자바 프로 그래 밍 제어 기반,거의 사용 되 지 않 음)--demo 1 패키지 참조
TransactionTemplate 를 이용 하여 여러 DAO 작업 을 봉인 합 니 다.
*b.성명 식 사무 관리(Spring 기반 AOP 설정 제어)
-TransactionProxy Factory Bean 방식 을 기반 으로 합 니 다.(거의 사용 되 지 않 음)--demo 2 패키지 참조
트 랜 잭 션 관리 클래스 마다 TransactionProxy Factory Bean 을 설정 하여 강화 해 야 합 니 다.
-XML 설정 기반(자주 사용)--demo 3 패키지 참조
일단 설정 이 다 되면 클래스 에 아무것도 추가 할 필요 가 없습니다.
Action 이 대상 으로 사 무 를 삽입 하려 면
-주석 기반(설정 이 간단 하고 자주 사용)--demo 4 패키지 참조
applicationContext.xml 에서 트 랜 잭 션 주석 설정 을 엽 니 다.(applicationContext.xml 에서 Bean 을 정의 하고 다음 요 소 를 추가 합 니 다)
<bean id="txManager" class="...">
<property name="sessionFactory">
</property>
<tx:annotation-driven transaction-manager="txManager"/>
대상 구성 요소 클래스 에서@Transactional 을 사용 합 니 다.이 표 시 는 클래스 앞 이나 방법 앞 에 정의 할 수 있 습 니 다.4.예시(은행 이체)
--프로 그래 밍 식
/**
* @Description: DAO
*
*/
public interface AccountDao {
/**
* @param out
* :
* @param money
* :
*/
public void outMoney(String out, Double money);
/**
*
* @param in
* :
* @param money
* :
*/
public void inMoney(String in, Double money);
}
/**
* @Description: DAO
*/
public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao {
/**
* @param out
* :
* @param money
* :
*/
@Override
public void outMoney(String out, Double money) {
String sql = "update account set money = money-? where name = ?";
this.getJdbcTemplate().update(sql, money, out);
}
/**
* @param in
* :
* @param money
* :
*/
@Override
public void inMoney(String in, Double money) {
String sql = "update account set money = money+? where name = ?";
this.getJdbcTemplate().update(sql, money, in);
}
}
/**
* @Description:
*
*/
public interface AccountService {
/**
* @param out :
* @param in :
* @param money :
*/
public void transfer(String out,String in,Double money);
}
/**
* @Description:
*/
public class AccountServiceImpl implements AccountService {
// DAO
private AccountDao accountDao;
//
private TransactionTemplate transactionTemplate;
/**
* @param out
* :
* @param in
* :
* @param money
* :
*/
@Override
public void transfer(final String out, final String in, final Double money) {
// , , , ,
// accountDao.outMoney(out, money);
// int i = 1/0;
// accountDao.inMoney(in, money);
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(
TransactionStatus transactionStatus) {
accountDao.outMoney(out, money);
// int i = 1 / 0;// , ,
accountDao.inMoney(in, money);
}
});
}
public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
this.transactionTemplate = transactionTemplate;
}
}
applicationContext1.xml
<!-- -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- c3p0 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- -->
<bean id="accountService" class="com.zs.spring.demo1.AccountServiceImpl">
<property name="accountDao" ref="accountDao" />
<!-- -->
<property name="transactionTemplate" ref="transactionTemplate" />
</bean>
<!-- DAO ( , JdbcTemplate) -->
<bean id="accountDao" class="com.zs.spring.demo1.AccountDaoImpl">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- DAO ( ) -->
<!-- <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="accountDao" class="com.zs.spring.demo1.AccountDaoImpl">
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean> -->
<!-- ==================================1. =============================================== -->
<!-- -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- :Spring -->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"/>
</bean>
테스트:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext1.xml")
public class TransactionTest {
@Resource(name = "accountService")
private AccountService accountService;
@Test
public void demo1() {
accountService.transfer("aaa", "bbb", 200d);
}
}
--TransactionProxy Factory Bean 기반 방식
public class AccountServiceImpl implements AccountService {
// DAO
private AccountDao accountDao;
/**
* @param out
* :
* @param in
* :
* @param money
* :
*/
@Override
public void transfer(String out, String in, Double money) {
accountDao.outMoney(out, money);
// int i = 1/0;
accountDao.inMoney(in, money);
}
public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
}
applicationContext2.xml
<!-- -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- c3p0 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- -->
<bean id="accountService" class="com.zs.spring.demo2.AccountServiceImpl">
<property name="accountDao" ref="accountDao" />
</bean>
<!-- DAO ( , JdbcTemplate) -->
<bean id="accountDao" class="com.zs.spring.demo2.AccountDaoImpl">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- ==================================2. XML ( )=============================================== -->
<!-- -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- -->
<bean id="accountServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!-- -->
<property name="target" ref="accountService" />
<!-- -->
<property name="transactionManager" ref="transactionManager"></property>
<!-- -->
<property name="transactionAttributes">
<props>
<!--
prop :
* PROPAGATION :
* ISOTATION :
* readOnly :
* -EXCEPTION :
* +EXCEPTION :
-->
<prop key="transfer">PROPAGATION_REQUIRED</prop>
<!-- <prop key="transfer">PROPAGATION_REQUIRED,readOnly</prop> -->
<!-- <prop key="transfer">PROPAGATION_REQUIRED,+java.lang.ArithmeticException</prop> -->
</props>
</property>
</bean>
테스트:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext2.xml")
public class TransactionTest {
/**
* :
*/
// @Resource(name="accountService")
@Resource(name = "accountServiceProxy")
private AccountService accountService;
@Test
public void demo1() {
accountService.transfer("aaa", "bbb", 200d);
}
}
--XML 기반 설정
public class AccountServiceImpl implements AccountService {
// DAO
private AccountDao accountDao;
/**
* @param out
* :
* @param in
* :
* @param money
* :
*/
@Override
public void transfer(String out, String in, Double money) {
accountDao.outMoney(out, money);
// int i = 1/0;
accountDao.inMoney(in, money);
}
public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
}
applicationContext3.xml
<!-- -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- c3p0 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- -->
<bean id="accountService" class="com.zs.spring.demo3.AccountServiceImpl">
<property name="accountDao" ref="accountDao" />
</bean>
<!-- DAO ( , JdbcTemplate) -->
<bean id="accountDao" class="com.zs.spring.demo3.AccountDaoImpl">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- ==================================3. XML , tx/aop=============================================== -->
<!-- -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!--
propagation :
isolation :
read-only :
rollback-for:
no-rollback-for :
timeout :
-->
<tx:method name="transfer" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- -->
<aop:config>
<!-- -->
<aop:pointcut expression="execution(* com.zs.spring.demo3.AccountService+.*(..))" id="pointcut1"/>
<!-- -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>
</aop:config>
테스트:
/**
* @Description:Spring : AspectJ XML
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext3.xml")
public class TransactionTest {
/**
* :
*/
@Resource(name = "accountService")
private AccountService accountService;
@Test
public void demo1() {
accountService.transfer("aaa", "bbb", 200d);
}
}
--주해 에 기초 하 다
/**
* @Transactional propagation : isolation : readOnly :
* rollbackFor : noRollbackFor :
* rollbackForClassName
*/
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false)
public class AccountServiceImpl implements AccountService {
// DAO
private AccountDao accountDao;
/**
* @param out
* :
* @param in
* :
* @param money
* :
*/
@Override
public void transfer(String out, String in, Double money) {
accountDao.outMoney(out, money);
// int i = 1/0;
accountDao.inMoney(in, money);
}
public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
}
applicationContext4.xml
<!-- -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- c3p0 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- -->
<bean id="accountService" class="com.zs.spring.demo4.AccountServiceImpl">
<property name="accountDao" ref="accountDao" />
</bean>
<!-- DAO ( , JdbcTemplate) -->
<bean id="accountDao" class="com.zs.spring.demo4.AccountDaoImpl">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- ==================================4. ============================================ -->
<!-- -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- -->
<tx:annotation-driven transaction-manager="transactionManager"/>
테스트:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext4.xml")
public class TransactionTest {
/**
* :
*/
@Resource(name = "accountService")
private AccountService accountService;
@Test
public void demo1() {
accountService.transfer("aaa", "bbb", 200d);
}
}
구체 적 인 코드 와 데이터베이스 파일 참조 항목 의 전체 코드:http://xiazai.jb51.net/201805/yuanma/Spring-transaction_jb51.rar
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.