我正在为Android应用程序创建酒店预订系统。
我在考虑如何实施一种安全的方式将预订插入我的数据库。该请求将通过我的Web服务从应用程序发送到MySQL数据库(托管在Web服务器上)。
当我创建预订时,我插入:CustomerID,HotelID,RoomID(通过嵌套的select语句查找可用房间),checkInDate和checkOutDate。
但是,如果两个人在大致相同的时间点击“立即预订”,我怎么能确保两个不同的人不会预订相同/最后一个房间。我考虑过将Synchornised
用于java方法,但是如果不同手机上的一系列不同用户试图预订会有什么不同吗?
答案 0 :(得分:0)
我认为你不会像避免竞争条件一样询问线程。
不了解您的架构,避免这种竞争的一种方法是设置每个用户点击“立即预订”按钮并将其作为交易中的字段传递的时间戳。然后,应用程序服务器将根据时间戳对其队列中的所有条目进行排序,而不是按照它们到达的顺序接受它们。
答案 1 :(得分:0)
您要找的是transactions。
使用事务,您可以将对给定记录集的访问隔离到单个原子逻辑实体中。某种复杂性的任何操作都会影响多行,列甚至表,或者需要多个(原子或非原子)语句才能完成。事务是一种确保数据逻辑一致性的机制,即使这些操作中的任何一个失败也是如此。在这种情况下,将回滚未完成的事务,否则将提交事务。
这些正是交易的两种可能结果:commit
或rollback
。在伪代码中,它看起来像这样:
begin transaction
try {
required operations to reserve a room for a given time frame
if( success)
commit transaction
else
rollback transaction
} catch {
rollback transaction
}
使用Java进行同步当然是可行的,但它有几个主要缺点:
答案 2 :(得分:0)
您需要创建一个唯一的密钥{房间号,日期},以便每个房间每个日期只能预订一个。然后,客户预订将成为与预订中的天数一样多的行的插入,在交易中执行。
线程与它几乎无关。