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)
);
public interface UserMapper {
User getUserById(int id);
}
public interface OrderMapper {
int insertOrder(Order order);
}
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
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
方法中,我们首先检查用户是否存在,如果不存在则抛出一个运行时异常。如果用户存在,我们创建一个新的订单并插入到数据库中。如果在创建订单的过程中出现任何异常,事务会自动回滚,保证数据的一致性。
辰迅云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>