1. 程式人生 > >【spring事務管理】

【spring事務管理】

一、事務的作用

  將若干的資料庫操作作為一個整體控制,一起成功或一起失敗。
  原子性:指事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。
  一致性:指事務前後資料的完整性必須保持一致。
  隔離性:指多個使用者併發訪問資料庫時,一個使用者的事務不能被其他使用者的事務所幹擾,多個併發事務之間資料要相互隔離。
  永續性:指一個事務一旦被提交,它對資料庫中資料的改變就是永久性的,即時資料庫發生故障也不應該對其有任何影響。

二、Spring事務管理高層抽象主要包括3個介面

  –Platform TransactionManager 事務管理器(提交、回滾事務)
     Spring為不同的持久化框架提供了不同的Platform TransactionManager介面實現。如:
        使用Spring JDBC或iBatis進行持久化資料時使用DataSourceTransactionManager
        使用Hibernate3.0版本進行持久化資料時使用HibernateTransactionManager
  –TransactionDefinition
事務定義資訊(隔離、傳播、超時、只讀)
        髒讀:一個事務讀取了另一個事務改寫但還未提交的資料,如果這些資料被回滾,則讀到的資料是無效的。
        不可重複讀:在同一事務中,多次讀取同一資料返回的結果有所不同。
        幻讀:一個事務讀取了幾行記錄後,另一個事務插入一些記錄,幻讀就發生了。再後來的查詢中,第一個事務就會發現有些原來沒有的記錄。
        事務隔離級別:(五種)
  •     DEFAULT–使用後端資料庫預設的隔離級別(Spring中的選擇項)
  •     READ_UNCOMMITED–允許你讀取還未提交的改變了的資料。可能導致髒、幻、不可重複讀
  •     READ_COMMITTED–允許在併發事務已經提交後讀取。可防止髒讀,但幻讀和不可重複讀仍可發生
  •     REPEATABLE_READ–對相同欄位的多次讀取是一致的,除非資料被事務本身改變。可防止髒、不可重複讀,但幻讀仍可能發生
  •     SERIALIZABLE–完全服從ACID的隔離級別,確保不發生髒、幻、不可重複讀。這在所有的隔離級別中是最慢的,它是典型的通過完全鎖定在事務中涉及的資料表來完成的
    其中,MySQL預設採用REPEATABLE_READ隔離級別;Oracle預設採用READ_COMMITTED隔離級別

        事務傳播行為:(七種)
  •     REQUIRED–支援當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。
  •     SUPPORTS–支援當前事務,如果當前沒有事務,就以非事務方式執行。
  •     MANDATORY–支援當前事務,如果當前沒有事務,就丟擲異常。
  •     REQUIRES_NEW–新建事務,如果當前存在事務,把當前事務掛起。
  •     NOT_SUPPORTED–以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
  •     NEVER–以非事務方式執行,如果當前存在事務,則丟擲異常。
  •     NESTED–如果當前存在事務,則在巢狀事務內執行。如果當前沒有事務,則進行與REQUIRED類似的操作。擁有多個可以回滾的儲存點,內部回滾不會對外部事務產生影響。只對DataSourceTransactionManager有效
  –TransactionStatus 事務具體執行狀態

三、Spring提供了以下方法控制事務

  a.程式設計式事務管理(基於Java程式設計控制,很少使用)–見demo1包
       利用TransactionTemplate將多個DAO操作封裝起來
  *b.宣告式事務管理(基於Spring的AOP配置控制)
       -基於TransactionProxyFactoryBean的方式.(很少使用)–見demo2包
            需要為每個進行事務管理的類,配置一個TransactionProxyFactoryBean進行增強.
       -基於XML配置(經常使用)–見demo3包
            一旦配置好之後,類上不需要新增任何東西。
            如果Action作為目標物件切入事務,需要在<aop:config>元素裡新增proxy-target-class=”true”屬性。原因是通知Spring框架採用CGLIB技術生成具有事務管理功能的Action類。
       -基於註解(配置簡單,經常使用)–見demo4包
            在applicationContext.xml中開啟事務註解配置。(applicationContext.xml中只需定義Bean並追加以下元素)
<bean id=”txManager” class=”…”>
  <property name=”sessionFactory”>
  </property>
<tx:annotation-driven transaction-manager=”txManager”/>

            在目標元件類中使用@Transactional,該標記可定義在類前或方法前。

四、示例(銀行轉賬)

        –程式設計式

[java] view plain copy print?
  1. /** 
  2.  * @Description:轉賬案例的DAO層介面 
  3.  *  
  4.  */
  5. publicinterface AccountDao {  
  6.     /** 
  7.      * @param out 
  8.      *            :轉出賬號 
  9.      * @param money 
  10.      *            :轉賬金額 
  11.      */
  12.     publicvoid outMoney(String out, Double money);  
  13.     /** 
  14.      *  
  15.      * @param in 
  16.      *            :轉入賬號 
  17.      * @param money 
  18.      *            :轉賬金額 
  19.      */
  20.     publicvoid inMoney(String in, Double money);  
  21. }  
/**
 * @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);
}

[java] view plain copy print?
  1. /** 
  2.  * @Description:轉賬案例的DAO層實現類 
  3.  */
  4. publicclass AccountDaoImpl extends JdbcDaoSupport implements AccountDao {  
  5.     /** 
  6.      * @param out 
  7.      *            :轉出賬號 
  8.      * @param money 
  9.      *            :轉賬金額 
  10.      */
  11.     @Override
  12.     publicvoid outMoney(String out, Double money) {  
  13.         String sql = ”update account set money = money-? where name = ?”;  
  14.         this.getJdbcTemplate().update(sql, money, out);  
  15.     }  
  16.     /** 
  17.      * @param in 
  18.      *            :轉入賬號 
  19.      * @param money 
  20.      *            :轉賬金額 
  21.      */
  22.     @Override
  23.     publicvoid inMoney(String in, Double money) {  
  24.         String sql = ”update account set money = money+? where name = ?”;  
  25.         this.getJdbcTemplate().update(sql, money, in);  
  26.     }  
  27. }  
/**
 * @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);
    }
}

[java] view plain copy print?
  1. /** 
  2.  * @Description:轉賬案例的業務介面 
  3.  * 
  4.  */
  5. publicinterface AccountService {  
  6.     /** 
  7.      * @param out   :轉出賬號 
  8.      * @param in    :轉入賬號 
  9.      * @param money :轉賬金額 
  10.      */
  11.     publicvoid transfer(String out,String in,Double money);  
  12. }  
/**
 * @Description:轉賬案例的業務介面
 *
 */
public interface AccountService {
    /**
     * @param out   :轉出賬號
     * @param in    :轉入賬號
     * @param money :轉賬金額
     */
    public void transfer(String out,String in,Double money);
}

[java] view plain copy print?
  1. /** 
  2.  * @Description:轉賬案例的業務層實現類 
  3.  */
  4. publicclass AccountServiceImpl implements AccountService {  
  5.     // 注入轉賬的DAO
  6.     private AccountDao accountDao;  
  7.     // 注入事務管理的模板
  8.     private TransactionTemplate transactionTemplate;  
  9.     /** 
  10.      * @param out 
  11.      *            :轉出賬號 
  12.      * @param in 
  13.      *            :轉入賬號 
  14.      * @param money 
  15.      *            :轉賬金額 
  16.      */
  17.     @Override
  18.     publicvoid transfer(final String out, final String in, final Double money) {  
  19.         // 未經事務控制的業務處理操作,如果過程中出異常,則導致前面的操作能完成,後面的不能,即轉賬成功但未收到轉賬款
  20.         // accountDao.outMoney(out, money);
  21.         // int i = 1/0;
  22.         // accountDao.inMoney(in, money);
  23.         transactionTemplate.execute(new TransactionCallbackWithoutResult() {  
  24.             @Override
  25.             protectedvoid doInTransactionWithoutResult(  
  26.                     TransactionStatus transactionStatus) {  
  27.                 accountDao.outMoney(out, money);  
  28.                 // int i = 1 / 0;//事務控制,即出現異常,該段內程式碼都執行失效
  29.                 accountDao.inMoney(in, money);  
  30.             }  
  31.         });  
  32.     }  
  33.     publicvoid setAccountDao(AccountDao accountDao) {  
  34.         this.accountDao = accountDao;  
  35.     }  
  36.     publicvoid setTransactionTemplate(TransactionTemplate transactionTemplate) {  
  37.         this.transactionTemplate = transactionTemplate;  
  38.     }  
  39. }  
/**
 * @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 [html] view plain copy print?
  1. <!– 引入外部的屬性檔案 –>
  2.     <context:property-placeholderlocation=“classpath:jdbc.properties”/>
  3.     <!– 配置c3p0連線池 –>
  4.     <beanid=“dataSource”class=“com.mchange.v2.c3p0.ComboPooledDataSource”>
  5.         <propertyname=“driverClass”value={jdbc.driverClass}"</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"jdbcUrl"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"{jdbc.url}”/>
  6.         <propertyname=“user”value={jdbc.username}"</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"password"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"{jdbc.password}”/>
  7.     </bean>
  8.     <!– 配置業務層類 –>
  9.     <beanid=“accountService”class=“com.zs.spring.demo1.AccountServiceImpl”>
  10.         <propertyname=“accountDao”ref=“accountDao”/>
  11.         <!– 注入事務管理的模板 –>
  12.         <propertyname=“transactionTemplate”ref=“transactionTemplate”/>
  13.     </bean>
  14.     <!– 配置DAO類(簡化,會自動配置JdbcTemplate) –>
  15.     <beanid=“accountDao”class=“com.zs.spring.demo1.AccountDaoImpl”>
  16.         <propertyname=“dataSource”ref=“dataSource”/>
  17.     </bean>
  18.     <!– 配置DAO類(未簡化) –>
  19.     <!– <beanid=“jdbcTemplate”class=“org.springframework.jdbc.core.JdbcTemplate”>
  20.         <propertyname=“dataSource”ref=“dataSource”/>
  21.     </bean>
  22.     <beanid=“accountDao”class=“com.zs.spring.demo1.AccountDaoImpl”>
  23.         <propertyname=“jdbcTemplate”ref=“jdbcTemplate”/>
  24.     </bean> –>
  25.     <!– ==================================1.程式設計式的事務管理=============================================== –>
  26.     <!– 配置事務管理器 –>
  27.     <beanid=“transactionManager”class=“org.springframework.jdbc.datasource.DataSourceTransactionManager”>
  28.         <propertyname=“dataSource”ref=“dataSource”/>
  29.     </bean>
  30.     <!– 配置事務管理的模板:Spring為了簡化事務管理的程式碼而提供的類 –>
  31.     <beanid=“transactionTemplate”class=“org.springframework.transaction.support.TransactionTemplate”>
  32.         <propertyname=“transactionManager”ref=“transactionManager”/>
  33.     </bean>
<!-- 引入外部的屬性檔案 -->
    <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>

測試: [java] view plain copy print?
  1. @RunWith(SpringJUnit4ClassRunner.class)  
  2. @ContextConfiguration(“classpath:applicationContext1.xml”)  
  3. publicclass TransactionTest {  
  4.     @Resource(name = “accountService”)  
  5.     private AccountService accountService;  
  6.     @Test
  7.     publicvoid demo1() {  
  8.         accountService.transfer(”aaa”“bbb”, 200d);  
  9.     }  
  10. }  
@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);
    }
}

    –基於TransactionProxyFactoryBean的方式
[java] view plain copy print?
  1. publicclass AccountServiceImpl implements AccountService {  
  2.     // 注入轉賬的DAO
  3.     private AccountDao accountDao;  
  4.     /** 
  5.      * @param out 
  6.      *            :轉出賬號 
  7.      * @param in 
  8.      *            :轉入賬號 
  9.      * @param money 
  10.      *            :轉賬金額 
  11.      */
  12.     @Override
  13.     publicvoid transfer(String out, String in, Double money) {  
  14.         accountDao.outMoney(out, money);  
  15.         // int i = 1/0;
  16.         accountDao.inMoney(in, money);  
  17.     }  
  18.     publicvoid setAccountDao(AccountDao accountDao) {  
  19.         this.accountDao = accountDao;  
  20.     }  
  21. }  
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
[html] view plain copy print?
  1. <!– 引入外部的屬性檔案 –>
  2.     <context:property-placeholderlocation=“classpath:jdbc.properties”/>
  3.     <!– 配置c3p0連線池 –>
  4.     <beanid=“dataSource”class=“com.mchange.v2.c3p0.ComboPooledDataSource”>
  5.         <propertyname=“driverClass”value={jdbc.driverClass}"</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"jdbcUrl"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"{jdbc.url}”/>
  6.         <propertyname=“user”value={jdbc.username}"</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"password"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"{jdbc.password}”/>
  7.     </bean>
  8.     <!– 配置業務層類 –>
  9.     <beanid=“accountService”class=“com.zs.spring.demo2.AccountServiceImpl”>
  10.         <propertyname=“accountDao”ref=“accountDao”/>
  11.     </bean>
  12.     <!– 配置DAO類(簡化,會自動配置JdbcTemplate) –>
  13.     <beanid=“accountDao”class=“com.zs.spring.demo2.AccountDaoImpl”>
  14.         <propertyname=“dataSource”ref=“dataSource”/>
  15.     </bean>
  16.     <!– ==================================2.使用XML配置宣告式的事務管理(原始方式)=============================================== –>
  17.     <!– 配置事務管理器 –>
  18.     <beanid=“transactionManager”class=“org.springframework.jdbc.datasource.DataSourceTransactionManager”>
  19.         <propertyname=“dataSource”ref=“dataSource”/>
  20.     </bean>
  21.     <!– 配置業務層的代理 –>
  22.     <beanid=“accountServiceProxy”class=“org.springframework.transaction.interceptor.TransactionProxyFactoryBean”>
  23.         <!– 配置目標物件 –>
  24.         <propertyname=“target”ref=“accountService”/>
  25.         <!– 注入事務管理器 –>
  26.         <propertyname=“transactionManager”ref=“transactionManager”></property>
  27.         <!– 注入事務的屬性 –>
  28.         <propertyname=“transactionAttributes”>
  29.             <props>
  30.                 <!–   
  31.                     prop的格式:  
  32.                         * PROPAGATION   :事務的傳播行為  
  33.                         * ISOTATION     :事務的隔離級別  
  34.                         * readOnly      :只讀  
  35.                         * -EXCEPTION    :發生哪些異常回滾事務  
  36.                         * +EXCEPTION    :發生哪些異常不回滾事務  
  37.                  –>
  38.                 <propkey=“transfer”>PROPAGATION_REQUIRED</prop>
  39.                 <!– <prop key=”transfer”>PROPAGATION_REQUIRED,readOnly</prop> –>
  40.                 <!– <prop key=”transfer”>PROPAGATION_REQUIRED,+java.lang.ArithmeticException</prop> –>
  41.             </props>
  42.         </property>
  43.     </bean>
<!-- 引入外部的屬性檔案 -->
    <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>

測試: [java] view plain copy print?
  1. @RunWith(SpringJUnit4ClassRunner.class)  
  2. @ContextConfiguration(“classpath:applicationContext2.xml”)  
  3. publicclass TransactionTest {  
  4.     /** 
  5.      * 一定要注入代理類:因為代理類進行增強的操作 
  6.      */
  7.     // @Resource(name=”accountService”)
  8.     @Resource(name = “accountServiceProxy”)  
  9.     private AccountService accountService;  
  10.     @Test
  11.     publicvoid demo1() {  
  12.         accountService.transfer(”aaa”“bbb”, 200d);  
  13.     }  
  14. }  
@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配置 [java] view plain copy print?
  1. publicclass AccountServiceImpl implements AccountService {  
  2.     // 注入轉賬的DAO
  3.     private AccountDao accountDao;  
  4.     /** 
  5.      * @param out 
  6.      *            :轉出賬號 
  7.      * @param in 
  8.      *            :轉入賬號 
  9.      * @param money 
  10.      *            :轉賬金額 
  11.      */
  12.     @Override
  13.     publicvoid transfer(String out, String in, Double money) {  
  14.         accountDao.outMoney(out, money);  
  15.         // int i = 1/0;
  16.         accountDao.inMoney(in, money);  
  17.     }  
  18.     publicvoid setAccountDao(AccountDao accountDao) {  
  19.         this.accountDao = accountDao;  
  20.     }  
  21. }  
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
[html] view plain copy print?
  1. 相關推薦

    spring事務管理

    一、事務的作用   將若干的資料庫操作作為一個整體控制,一起成功或一起失敗。   原子性:指事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。   一致性:指事務前後資料的完整性必須保持一致。   隔離性:指多個使用者併發訪問資料庫時,一個使用者的事務不能被其他使用者的事務所幹擾,多個

    Spring事務管理Transaction

    集成 class advice nag batis spring3 ont weblogic tex Spring提供了許多內置事務管理器實現(原文鏈接:https://www.cnblogs.com/qiqiweige/p/5000086.html): DataSo

    Spring實戰----Spring事務管理配置解析

    上篇說了aop的配置,並且說了Spring事務管理是基於aop的,那麼Spring宣告式事務的配置就有兩種方式:XML配置及註解配置不多說,直接看配置檔案一、配置檔案applicationContext-transaction.xml<?xml version="1.0

    面試足夠“忽悠”面試官的『Spring事務管理器』原始碼閱讀梳理(建議珍藏)

    PS:文章內容涉及原始碼,請耐心閱讀。     理論實踐,相輔相成 偉大領袖毛主席告訴我們實踐出真知。這是無比正確的。但是也會很辛苦。就像淘金一樣,從大量沙子中淘出金子一定是一個無比艱辛的過程。但如果真能淘出來,也一定是像金子一樣寶貴的東西。他老人家還說過,當真知上升為理論的時候

    Spring學習34Spring事務(4):事務屬性之7種傳播行為

    事務傳播行為 什麼叫事務傳播行為?聽起來挺高階的,其實很簡單。 即然是傳播,那麼至少有兩個東西,才可以發生傳播。單體不存在傳播這個行為。 事務傳播行為(propagation behavior)指的就是當一個事務方法被另一個事務方法呼叫時,這個事務方法應該

    Shiro許可權管理3.Shiro整合 Spring

    下面來說一下如何在Web下使用Shiro。 在大部分Web開發環境下,都是使用Spring與Shiro進行整合,所以下面直接來講解Shiro與Spring整合的方式。 一、準備環境 (1)加入Spring和Shiro的jar包 首先在MyEclipse中新建一個Web工程:

    spring事務管理 TransactionProxyFactoryBean源碼分析

    java 事務管理 J2EE,當然離不開事務,事務又當然少不了Spring聲明式事務。spring聲明式事務,很多碼農門,應該和筆者一樣,停留在使用上,及僅僅了解點原理。如:Spring事務管理原理“代理+AOP”,再深入了解就不太清楚了。一直對聲明式事務實現特別感興趣,今天抽時間,剖析一下下。1.準

    Spring事務管理

    classpath 依賴 font word .get 執行 pointcut str 攔截 1、導入jar包 spring核心包 commons-logging.jar spring-beans.jar spring-context.jar spring-core.jar

    SVN版本管理

    svn版本管理第1章 SVN希望大家可以一起學習,可以加筆者QQ864161921.1 SVN簡介SVN是Subversion的簡稱,是一個開放源代碼的版本控制系統。Subversion管理著隨時間改變的數據。這些數據放置在一個中央資料檔案庫(repository)中。這個檔案庫很像一個普通的文件服務器,不過

    Spring事務管理----------整合學習版

    XML idt 類定義 dao mda info spring配置 讀取數據 blue 作者:學無先後 達者為先 Spring提供了一流的事務管理。在Spring中可以支持聲明式事務和編程式事務。 一 spring簡介 1 Spring的事務 事

    spring事務管理,xml配置aop事務和註解配置aop事務

    mov ref itcast template password nds eth poi ntc xml配置和註解配合共同代碼 AccountService.java public interface AccountService { //轉賬方法

    spring 事務管理的簡單配置

    ger string oot code nal chan 價格 nts 每次 1:事務的優點   事務管理對平時的業務邏輯的健壯性幫助很大,它保證了一個動作的原子性   本例中主要體現在,購票或者購書中,業務邏輯如下:     1:根據商品的ID查詢該商品的價格,     

    (轉)spring事務管理幾種方式

    pac jpg gets point aos load man classpath XML 轉自:http://blog.csdn.net/jeamking/article/details/43982435 前段時間對Spring的事務配置做了比較深入的研究,在此之間對

    Spring事務管理API

    logs 技術 -1 blog 9.png src es2017 http .cn Spring事務管理API

    項目管理經驗之談 | 資深項目經理都避免的5個坑,你中招了嗎?

    尊重 最終 fail 同方 快速 這就是 tro 理解 動力 哈嘍!大家好! 那天看到最有趣的一句話就是 為了填坑,一位項目經理胖了20斤 。。。。。 今天就給大家介紹一下 項目經理要註意的那些“坑” 項目經理“誤踩雷區” 1 未告知成員工作目標 作為項目經理

    spring事務管理aop

    jdbc tran err att get ted cor cep pack 達內12 note unit 09 01 1.spring事務管理 2.spring提供了對事務管理支持 spring采用aop機制完成事務控制 可以實現在不修改原有組件代碼情況下實現事務控制功能

    Java Spring-事務管理概述

    dot nat 框架 3.0 信息 commit int 效率 cti 2017-11-11 23:05:39 事務(Transaction):是邏輯上一組操作,要麽全都成功,要麽全都失敗。 一、事務的特性 原子性:事務不可分割 一致性:事務執行的前後,數據完整性保持一致

    Spring---AOP註解開發&jdbc模板&Spring事務管理

    use oca update -m spl pub tex com att 一、AOP註解開發   此處需要回憶一遍AOP的概念。簡單的來說,AOP就是利用動態代理技術,做到不觸動源代碼但卻擴展了功能。那麽就需要一個被擴展的對象和一個“新的功能”,例如說給某類的saveUs

    [Spring框架]Spring 事務管理基礎入門總結.

    復制 tor junit4 dao img bubuko 說過 應該 pat 前言:在之前的博客中已經說過了數據庫的事務, 不過那裏面更多的是說明事務的一些鎖機制, 今天來說一下Spring管理事務的一些基礎知識. 之前的文章: [數據庫事務與鎖]詳解一: 徹底理解數據庫