在一家公司进行面试时,面试官提出了一道业务上BUG的。如下:
假设我们有一个在线图书销售系统,用户可以在系统中浏览书籍、添加购物车、下订单。系统有一个功能是允许用户在订单提交后进行订单修改,包括修改书籍数量、书籍价格等。是一个简化版的订单修改功能的伪代码:
python
def modify_order(order_id, new_quantity, new_price):
order = get_order_by_id(order_id)
if order is None:
raise ValueError("Order not found")
if new_quantity < 0 or new_price < 0:
raise ValueError("Quantity and price must be non-negative")
order.quantity = new_quantity
order.price = new_price
save_order(order)
在上述代码中,有一个潜在的BUG。请找出这个BUG并解释为什么这是一个BUG。
解答
在上述伪代码中,我们可以看到一个简单的订单修改函数`modify_order`。这个函数接收订单ID、新的数量和新的价格作为参数,并尝试更新订单中的数量和价格。是分析这个函数可能存在的
1. 潜在的数据不一致:
在函数中,通过`get_order_by_id(order_id)`获取订单对象。订单不存在,函数会抛出一个`ValueError`异常。这是一个做法,可以防止对不存在的订单进行操作。
在获取订单对象之后,在执行`order.quantity = new_quantity`和`order.price = new_price`之前,有其他线程或进程对同一个订单进行了修改,当前线程可能会看到不一致的数据。这可能导致情况:
– 用户看到的价格和数量与实际数据库中的数据不匹配。
– 其他线程已经修改了数量或价格,当前线程的修改可能不会被保存。
2. 可能的异常处理:
函数中没有显式地处理`save_order`可能抛出的异常。`save_order`在保存更新后的订单时失败,数据库中的数据将不会反映当前线程所做的修改。
是修正后的代码,解决了上述
python
def modify_order(order_id, new_quantity, new_price):
try:
order = get_order_by_id(order_id)
if order is None:
raise ValueError("Order not found")
if new_quantity < 0 or new_price < 0:
raise ValueError("Quantity and price must be non-negative")
# 添加锁来防止数据不一致
lock = acquire_lock(order_id)
try:
order.quantity = new_quantity
order.price = new_price
save_order(order)
finally:
release_lock(lock)
except Exception as e:
# 处理其他可能发生的异常
log_exception(e)
raise
在修正后的代码中,我们添加了改进:
– 使用锁(`acquire_lock`和`release_lock`)来确保在修改订单时,其他线程不能对其进行修改,从而避免了数据不一致的。
– 添加了异常处理,以便在`save_order`失败时记录异常并重新抛出,以确保调用者能够得到错误信息。
通过这些改进,我们可以确保订单修改功能在多线程环境中更加可靠和安全。
还没有评论呢,快来抢沙发~