阅读量:0
MyBatis 事务回滚的实际案例通常涉及到数据库操作的异常处理。当一个事务中的操作出现异常时,我们需要确保整个事务能够回滚,以保持数据的一致性。以下是一个简单的实际案例:
假设我们有一个用户管理系统,其中包括用户表(user)和订单表(order)。当用户下订单时,我们需要先检查用户是否存在,然后创建订单。如果在这个过程中出现任何异常,我们需要回滚事务。
- 首先,创建用户表和订单表:
CREATE TABLE user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(255) NOT NULL UNIQUE ); CREATE TABLE order ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT NOT NULL, product VARCHAR(255) NOT NULL, FOREIGN KEY (user_id) REFERENCES user(id) );
- 创建 UserMapper 和 OrderMapper 接口:
public interface UserMapper { User getUserById(int id); } public interface OrderMapper { int insertOrder(Order order); }
- 创建 UserMapper.xml 和 OrderMapper.xml 配置文件:
UserMapper.xml:
<mapper namespace="com.example.mapper.UserMapper"> <select id="getUserById" resultType="com.example.entity.User"> SELECT * FROM user WHERE id = #{id} </select> </mapper>
OrderMapper.xml:
<mapper namespace="com.example.mapper.OrderMapper"> <insert id="insertOrder" parameterType="com.example.entity.Order"> INSERT INTO `order` (`user_id`, `product`) VALUES (#{userId}, #{product}) </insert> </mapper>
- 创建 Service 类,处理事务:
@Service public class UserService { @Autowired private UserMapper userMapper; @Autowired private OrderMapper orderMapper; @Transactional(rollbackFor = Exception.class) public void createOrder(int userId, String product) { try { User user = userMapper.getUserById(userId); if (user == null) { throw new RuntimeException("User not found"); } Order order = new Order(); order.setUserId(userId); order.setProduct(product); orderMapper.insertOrder(order); } catch (Exception e) { throw e; } } }
在这个例子中,我们使用 @Transactional
注解来标注 createOrder
方法,表示这个方法是一个事务。当方法内抛出异常时,事务会自动回滚。在 createOrder
方法中,我们首先检查用户是否存在,如果不存在则抛出一个运行时异常。如果用户存在,我们创建一个新的订单并插入到数据库中。如果在创建订单的过程中出现任何异常,事务会自动回滚,保证数据的一致性。