2014-12-06 84 views
1

我正在为Android应用程序创建酒店预订系统。如何安全地插入SQL?

我在想如何实现一个安全的方式来插入预订到我的数据库。该请求将通过我的Web服务从应用程序发送到MySQL数据库(托管在Web服务器上)。

当我创建预订时,我插入:CustomerID,HotelID,RoomID(通过嵌套select语句查找可用房间),checkInDate和checkOutDate。

但是,我怎样才能确保两个不同的人不会预订相同/最后一个房间,如果他们都大致同时打“现在预订”。我想过使用java方法使用Synchornised,但是如果不同手机上的不同用户尝试进行预订,这会有什么不同?

+0

阅读关于SQL锁定 – Simon 2014-12-06 18:31:34

回答

0

你在找什么是transactions

使用事务处理,您将能够将对给定记录集的访问隔离为单个原子逻辑实体。任何具有某种复杂性的操作都会影响多行,多列和偶数表,或者需要完成多个(原子或非原子)语句。事务是确保数据逻辑一致性的一种机制,即使这些操作中的任何操作失败。在这种情况下,不完整的事务会被回滚,否则事务会被提交。

而这些正是交易的两种可能结果:commitrollback。在伪代码,它看起来是这样的:

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中同步当然是可能的,但它有几大缺点:

  • 它阻止你缩放的应用程序,因为它仅影响当前进程。
  • 它也阻止你扩展解决方案,例如通过相关程序
  • 一个数据库事务是设计来处理事故,而不会产生数据不一致
0

我不认为你是在讨论线程化和避免竞争条件。

不知道你的架构有什么问题,避免这种竞争的一种方法是设置一个时间戳,当每个用户点击“立即预订”按钮并将其作为交易中的字段传递时。然后,应用服务器会根据时间戳对队列中的所有条目进行排序,而不是按照它们到达的顺序来接受它们。

0

共享数据,您需要创建一个独特的键{房号,日期}这样的房间只能有一个预订每日期。然后,客户预订成为插入行数,因为在预订中有几天会在交易中进行。

线程真的与它没有多大关系。

相关问题