真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網站制作重慶分公司

Spring事務有幾種實現(xiàn)方法

Spring事務有幾種實現(xiàn)方法?針對這個問題,今天小編總結這篇有關云服務器的文章,可供感興趣的小伙伴們參考借鑒,希望對大家有所幫助。

公司主營業(yè)務:網站設計、網站制作、移動網站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)建站是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)建站推出紫金免費做網站回饋大家。

Spring提供了一個事務管理接口,PlatformTransactionManager它里面提供了常用的事務操作的方法:

public interface PlatformTransactionManager {

//獲取事務狀態(tài)信息
    TransactionStatus getTransaction(@Nullable TransactionDefinition var1) throws TransactionException;
    //提交事務
    void commit(TransactionStatus var1) throws TransactionException;
    //回滾事務
    void rollback(TransactionStatus var1) throws TransactionException;
}

PlatformTransactionManager接口里面定義了提交,回滾等對事物操作的基本方法。

這里出現(xiàn)了兩個接口:

一:TransactionDefinition

它定義了事物的基本屬性

public interface TransactionDefinition {

    //返回事物的傳播行為

int getPropagationBehavior();
//返回事務的隔離級別,事務管理器根據(jù)它來控制另外一個事務可以看到本事務內的哪些數(shù)據(jù)。

int getIsolationLevel();
//返回事務必須在多少秒內完成
  int getTimeout();
//事務是否只讀,事務管理器能夠根據(jù)這個返回值進行優(yōu)化,確保事務是只讀的。
  boolean isReadOnly();

}

事物的傳播行為表示一個方法被另一個方法調用時事物如何傳播。

 

我有一篇文章詳細的講解了事物傳播行為:

 

事物的隔離級別 我在這篇文章里有詳述:

 

getTimeout()返回事物的超時時間,事物的執(zhí)行會不同程度的鎖定表,如果時間過長,其它事物對表的操作就會受到影響,執(zhí)行超時以后事物就會回滾。

isReadOnly()返回事物是否只讀,如果事物只是去讀取數(shù)據(jù)庫我們可以把它設置為只讀,數(shù)據(jù)庫就可以進行相應的優(yōu)化,提高執(zhí)行效率。

 

二:TransactionStatus

此接口提供了事物運行的具體狀態(tài)

public interface TransactionStatus extends SavepointManager, Flushable {
     boolean isNewTransaction();//是否是新的事物
     boolean hasSavepoint();//是否有恢復點
     void setRollbackOnly();//設置為只回滾
     boolean isRollbackOnly();//是否為只回滾
     boolean isCompleted();//是否已完成
 }
在回滾或提交操作的時候需要這些事物的狀態(tài)作為參數(shù)。
PlatformTransactionManager只是一個事物管理的接口,我們真正要用的是該接口的實現(xiàn)類,如果你是用Jdbc或mybatis操作數(shù)據(jù)庫需要使用事務管理類:
org.springframework.jdbc.datasource.DataSourceTransactionManager
如果用的是Hibernate需要使用事物管理類:
org.springframework.orm.hibernate5.HibernateTransactionManager
 
在spring中實現(xiàn)事物通常有兩種方式:
一:基于 XML 的聲明式事務控制(配置方式):
通過轉賬的例子來說明:

數(shù)據(jù)庫:

                                              Spring事務有幾種實現(xiàn)方法

第一步:導入依賴


     
         org.springframework
         spring-context
         5.0.2.RELEASE
     
     
         org.springframework
         spring-test
         5.0.2.RELEASE
     
         
     MySQL
     mysql-connector-java
     5.1.46
 

     org.springframework
     spring-jdbc
     5.0.2.RELEASE
 

         junit
         junit
         4.12
     
     
         org.aspectj
         aspectjweaver
         1.8.7
     
     
         org.springframework
         spring-tx
         5.0.2.RELEASE
     
 
 
spring-tx是事物管理的依賴,因為spring的事物管理底層使用的是aop所以需要把aop的依賴aspectjweaver也導入進來。
第二步:創(chuàng)建 spring 的配置文件并導入約束

 
 
第三步:創(chuàng)建Account實體類
第四步:編寫 Dao 接口和實現(xiàn)類

public interface IAccountDao {
//根據(jù)名稱查詢賬戶信息
Account findAccountByName(String name);
//更新賬戶信息
void updateAccount(Account account);

}

 

 

public class AccountDaoImpl implements IAccountDao {
     @Autowired
     private JdbcTemplate jt;
     public Account findAccountByName(String name) {
         List lst = jt.query("select * from account where name like ?",new BeanPropertyRowMapper(Account.class),name);
         return lst.isEmpty()?null:lst.get(0);
     }
     public void updateAccount(Account account) {
         jt.update("update account set money = ? where id = ? ",account.getMoney(),account.getId());
     }
 }
第五步:編寫業(yè)務層接口和實現(xiàn)類
public interface IAccountService {
 * 轉賬
 * @param sourceName 轉出賬戶名稱
 * @param targeName 轉入賬戶名稱
 * @param money 轉賬金額
 */
 void transfer(String sourceName,String targeName,Float money);//增刪改
}
 
/**
 * 賬戶的業(yè)務層實現(xiàn)類
 */
 public class AccountServiceImpl implements IAccountService {
     private IAccountDao accountDao;
         public void transfer(String sourceName, String targeName, Float money) {
         //1.根據(jù)名稱查詢兩個賬戶
         Account source = accountDao.findAccountByName(sourceName);
         Account target = accountDao.findAccountByName(targeName);
        //2.修改兩個賬戶的金額
         source.setMoney(source.getMoney()-money);//轉出賬戶減錢
         target.setMoney(target.getMoney()+money);//轉入賬戶加錢
        //3.更新兩個賬戶
         accountDao.updateAccount(source);
         int i=1/0;
         accountDao.updateAccount(target);
     }
 }
第六步:在配置文件中配置業(yè)務層和持久層

     
         
     
     
     
 
     
     
     
 
     
     
     
         
         
         
         

第七步:配置事務

Spring事務是基于aop的關于aop我在這篇文章里有詳細的講解:

 

 

 

配置步驟:

1: 配置事務管理器:

class="org.springframework.jdbc.datasource.DataSourceTransactionManager">



2:配置事務的通知引用事務管理器:


 

3:配置事務的屬性:


 
     
     
         
         
     
 

 

4:配置 AOP 切入點表達式:

    
 
     
     
     
     
 

 

我們看看這個配置:


   

說明對cn.xh.service下的所有類的所有方法加上事務。

再來看看這個配置:


 

         
         
     
 

這個配置說明以find開頭的方法事務的傳播方式為SUPPORTS,為只讀,其它的方法事務傳播方式為REQUIRED,不是只讀。

 

好啦,現(xiàn)在可以測試啦:

@RunWith(SpringJUnit4Cla***unner.class)
 @ContextConfiguration("classpath:applicationContext.xml")
 public class serviceTest {
     @Autowired
     private IAccountService serviceImpl;
     @Test
     public void testDo(){
         serviceImpl.transfer("%張%","%李%",1000f);
     }
 }
從張三賬戶往李四賬戶轉1000,因為有除零錯誤,事務回滾,張三賬戶還是2000,李四賬戶還是3000.
 
再來看看事務實現(xiàn)的第二種方式
二:基于注解的配置方式

我們重點看一下事務的注解配置,其它同上。

配置步驟:

第一步:配置事務管理器并注入數(shù)據(jù)源

class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

第二步:在業(yè)務層使用@Transactional 注解:

@Transactional(readOnly=true,propagation=Propagation.SUPPORTS)
public class AccountServiceImpl implements IAccountService {
      @Autowired
      private IAccountDao accountDao;
      @Override
      public Account findAccountById(Integer id) {
              return accountDao.findAccountById(id);
      }


      @Override
      @Transactional(readOnly=false,propagation=Propagation.REQUIRED)
      public void transfer(String sourceName, String targeName, Float money) {
              //1.根據(jù)名稱查詢兩個賬戶
             Account source = accountDao.findAccountByName(sourceName);
             Account target = accountDao.findAccountByName(targeName);
             //2.修改兩個賬戶的金額
            source.setMoney(source.getMoney()-money);//轉出賬戶減錢
            target.setMoney(target.getMoney()+money);//轉入賬戶加錢
            //3.更新兩個賬戶
            accountDao.updateAccount(source);
           //int i=1/0;
           accountDao.updateAccount(target);

}
}
該注解的屬性和 xml 中的屬性含義一致,該注解可以出現(xiàn)在接口上,類上和方法上。
出現(xiàn)接口上,表示該接口的所有實現(xiàn)類都有事務支持。
出現(xiàn)在類上,表示類中所有方法有事務支持
出現(xiàn)在方法上,表示方法有事務支持。
以上三個位置的優(yōu)先級:方法>類>接口

第三步:在配置文件中開啟 spring 對注解事務的支持:

關于Spring事務實現(xiàn)方法就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果喜歡這篇文章,不如把它分享出去讓更多的人看到。


網頁題目:Spring事務有幾種實現(xiàn)方法
當前網址:http://weahome.cn/article/ppdgpp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部