事务简介
事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性。
事务就是一系列的动作。它们被当做一个单独的工作单元。这些动作要么全部都完成,要么全部都不起作用。
Spring中的事务管理
作为企业级应用程序开发框架,Spring在不同事务管理API上定义了一个抽象层,而应用程序开发人员不必了解底层的事务管理API,就可以使用Spring的事务管理机制。
Spring既支持编程式事务管理,又支持声明式的事务管理。
编程式事务管理:将事务管理代码嵌入到业务方法中来控制事务的提交和回滚。在编程式管理事务时,必须在每个事务操作时包含额外的事务管理代码。
声明式事务管理:大多数情况下比编程式事务管理更好用,它将事务管理代码从业务方法中分离出来,以声明的方式来实现事务管理。事务管理作为一个横切关注点,可以通过AOP方法模块化。Spring通过Spring AOP框架支持声明式事务管理。
Spring从不同事务管理API中抽象出了一整套事务管理机制。开发人员不必了解底层的事务API,就可以利用这些机制。有了这些事务管理机制,事务管理代码就能独立于特定的事务技术了。
Spring的核心事务管理抽象是Interface PlatformTransactionManager管理封装了一组独立于技术的方法,无论使用Spring的那种事务管理策略(编程式或声明式),事务管理器都是必须的。
使用Spring的事务管理
首先创建一个接口(BookShopDAO)
public interface BookShopDAO {
public int findBookPriceByISBN(String ISBN);
public void updateBookStock(String ISBN);
public void updateUserAccount(String username, int price);
}
之后创建一个实现类(BookShopDAOImpl)并实现接口中的功能。
@Repository("bookShopDAO")
public class BookShopDAOImpl implements BookShopDAO {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public int findBookPriceByISBN(int ISBN) {
String sql = "select price from book where isbn = ? ";
return jdbcTemplate.queryForObject(sql, Integer.class, ISBN);
}
@Override
public void updateBookStock(int ISBN) {
String sql = "update book_stock set stock = stock - 1 where isbn = ? ";
jdbcTemplate.update(sql, ISBN);
}
@Override
public void updateUserAccount(String username, int price) {
String sql = "update account set balance = balance - ? where username = ? ";
jdbcTemplate.update(sql, price, username);
}
}
测试类
public class TransactionTest {
private ApplicationContext ctx = null;
private BookShopDAO bookShopDAO = null;
{
ctx = new ClassPathXmlApplicationContext("application-context.xml");
bookShopDAO = ctx.getBean(BookShopDAO.class);
}
@Test
public void testUserAccount(){
bookShopDAO.updateUserAccount("AA", 100);
}
@Test
public void testUpdateStock(){
bookShopDAO.updateBookStock(1001);
}
@Test
public void test(){
System.out.println(bookShopDAO.findBookPriceByISBN(1001));
}
}
我们上述的操作都是单一的操作。我们知道事务是一系列操作的集合。如果想实现事务的管理,我们需要把这些操作集中到一处。
先创建接口
public interface BookShopService {
public void purchase(String username, int ISBN);
}
实现类
@Repository("bookShopService")
public class BookShopServiceImpl implements BookShopService {
@Autowired
private BookShopDAO bookShopDAO;
@Override
public void purchase(String username, int ISBN) {
int price = bookShopDAO.findBookPriceByISBN(ISBN);
bookShopDAO.updateBookStock(ISBN);
bookShopDAO.updateUserAccount("AA", price);
}
}
测试类
public class TransactionTest {
private ApplicationContext ctx = null;
private BookShopService bookShopService = null;
{
ctx = new ClassPathXmlApplicationContext("application-context.xml");
bookShopService = ctx.getBean(BookShopService.class);
}
@Test
public void test(){
bookShopService.purchase("AA", 1001);
}
}
之后是重头戏,开始配置事务了。首先在配置文件中配置事务管理器。
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
之后在实现类中添加事务注解
@Transactional
@Override
public void purchase(String username, int ISBN) {
int price = bookShopDAO.findBookPriceByISBN(ISBN);
bookShopDAO.updateBookStock(ISBN);
bookShopDAO.updateUserAccount(username, price);
}
网友评论