1. 程式人生 > >spring的事務管理註解

spring的事務管理註解

clas lap 謝謝 closed 異常類 ctx ash upd ttr

軟件152班楊錦宏

spring的事務管理,本文的例子是:比如你需要網購一本書,賣書的那一方有庫存量以及書的價格,你有賬戶余額。回想我們在編程中要實現買書這樣的功能,由於你的賬戶表和書的庫存量表肯定不是同一張數據庫表,所以必定會有一個先後,要麽先將賬戶余額扣除書的價格,緊接著將書的庫存量減一,要麽反過來。那麽問題來了,假如我們先將你的賬戶余額減掉,然後發現書的庫存不足,這時怎麽辦呢,這就需要事務了,當我們發現書的庫存不足時就要回滾事務,將你的余額返回去。只要配置了事務,發生了異常,就回滾。這就是事務的回滾。註:新人理解,如有錯誤,望指正,謝謝。

配置文件applicationContext.xml:

技術分享 applicationContext.xml

配置文件jdbc.propertices:

user=root
password=123
driverClass=com.mysql.jdbc.Driver
jdbcUrl=jdbc\:mysql\:///spring?encoding\=UFT-8
initPoolSize=5
maxPoolSize=20

BookShopDao.java:

技術分享
package spring.tx;

public interface BookShopDao {

    public int findBookPriceByIsbn(String isbn);
    public void updataBookStock(String isbn);
    public void updataUserAccount(String username,int price);
}
技術分享

BookShopDaoImp.java:

技術分享 BookShopDaoImp

BookShopService.java:

package spring.tx;

public interface BookShopService {
    public void purchase(String username,String isbn);
}

BookShopServiceImpl.java:

技術分享 BookShopServiceImpl.java

Cashier.java:

技術分享
package spring.tx;

import java.util.List;

public interface Cashier {
    public void checkout(String username,List<String> isbns); 
}
技術分享

CashierImpl.java:

技術分享 CashierImpl

定義兩個異常類:

技術分享 BookStockException 技術分享 UserAccountExceptionse

測試方法:

技術分享
package spring.tx.test;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import spring.tx.BookShopDao;
import spring.tx.BookShopService;
import spring.tx.Cashier;

public class SpringTransactionTest {

    private ApplicationContext ctx=null;
    private BookShopDao bookShopDao;
    private BookShopService bookShopService;
    private Cashier cashier;
    {
        ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
        bookShopDao =(BookShopDao) ctx.getBean("bookShopDao");
        bookShopService=(BookShopService) ctx.getBean("bookShopService");
        cashier =(Cashier) ctx.getBean("cashier");
    }
    
    @Test
    public void testTransactionPropagation(){
        List<String > isbns=new ArrayList<String>();
        isbns.add("1001");
        isbns.add("1002");
        cashier.checkout("aaa", isbns);
    }
    
    @Test
    public  void testBookShopService() {
         bookShopService.purchase("aaa", "1001");
    }
    
    @Test
    public void testupdataBookStock(){
        bookShopDao.updataBookStock("1001");
    }
    
    @Test
    public void testUpdataUserAccount(){
        bookShopDao.updataUserAccount("aaa", 200);
    }
    
    @Test
    public void testBookShopDao(){
        int price=bookShopDao.findBookPriceByIsbn("1001");
        System.out.println(price);
    
    }
}

spring的事務管理註解