Spring提供了声明式事务管理和编程式事务管理两种方式。本文主要介绍Spring中的声明式事务管理的配置方法。
1. 配置数据源及事务管理器
首先需要配置数据源,这里以MySQL为例,配置方法如下:
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db_name"/>
<property name="username" value="db_user"/>
<property name="password" value="password"/>
</bean>
接着配置事务管理器:
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
2. 配置事务增强
接下来需要配置事务增强,让Spring知道哪些方法需要被事务管理。这可以使用aop来实现。
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut expression="execution(* com.example.service..*.*(..))" id="txPointcut"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>
上面的配置表示对service包下的所有以add、delete、update、get和find开头的方法进行事务管理,其中add、delete和update这三个方法需要使用REQUIRED传播机制,而get和find这两个方法使用SUPPORTS传播机制且只读。
示例
假如现在有一个UserService实现了添加用户和删除用户的方法:
public interface UserService {
void addUser(User user);
void deleteUser(int id);
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public void addUser(User user) {
userDao.addUser(user);
}
@Override
public void deleteUser(int id) {
userDao.deleteUser(id);
}
}
现在只需要在UserService上添加@Transactional注解,即可让这两个方法被事务管理。
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public void addUser(User user) {
userDao.addUser(user);
}
@Override
public void deleteUser(int id) {
userDao.deleteUser(id);
}
}
当addUser或deleteUser方法抛出未捕获的异常时,事务将会被回滚,确保数据的一致性。
另外还能在Spring MVC中使用@Transactional注解,以便更方便地管理Controller层中的事务。例如:
@RestController
@RequestMapping("/users")
@Transactional
public class UserController {
@Autowired
private UserService userService;
@PostMapping
public void addUser(@RequestBody User user) {
userService.addUser(user);
}
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable("id") int id) {
userService.deleteUser(id);
}
}
以上就是Spring中的事务管理如何配置的完整攻略,包含了配置数据源及事务管理器、配置事务增强和示例说明。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring中的事务管理如何配置 - Python技术站