【发布时间】:2019-05-25 21:31:18
【问题描述】:
我在 servlet 中有一个方法,可以在数据库中插入辅导预约。此方法有一个业务规则,用于检查该会话的导师在该日期和时间是否已经忙。代码看起来像这样:
class BookingService {
public void insert(Booking t) {
if(available(t.getTutor(), t.getDate(), t.getTime())) {
bookingDao.insert(t);
} else {
// reject
}
}
}
问题是多个用户可能同时尝试在相同的日期和时间预订同一个导师,并且没有什么可以阻止他们通过测试并插入他们的预订。我尝试过使insert() 同步并使用锁,但它不起作用。如何防止并发访问此方法?
【问题讨论】:
-
你接受了一些不好的建议。当应用程序有多个实例时,同步会失败(例如,这是在云中扩展的一种正常方式)。交易边界在哪里?
-
有很多方法可以解决这个问题。我同意
synchronized块并不适用于所有情况,但是 OP 没有指定多应用程序或云情况。 -
@Jason:如果您也描述解决问题的其他方法,您的答案将会大大改善。
-
有很多方法可以解决这个问题,以至于问题可能会进入
too broad和primarily opinion based的领域。我只是根据当时可用的信息描述了最简单的方法。
标签: java multithreading servlets concurrency