如何安全地插入SQL?

时间:2014-12-06 18:16:51

标签: android mysql multithreading thread-safety

我正在为Android应用程序创建酒店预订系统。

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

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

但是,如果两个人在大致相同的时间点击“立即预订”,我怎么能确保两个不同的人不会预订相同/最后一个房间。我考虑过将Synchornised用于java方法,但是如果不同手机上的一系列不同用户试图预订会有什么不同吗?

3 个答案:

答案 0 :(得分:0)

我认为你不会像避免竞争条件一样询问线程。

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

答案 1 :(得分: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进行同步当然是可行的,但它有几个主要缺点:

  • 它会阻止您扩展应用程序,因为它只影响当前进程。
  • 它还会阻止您扩展解决方案,例如通过与相关程序共享数据
  • 数据库事务旨在处理崩溃而不会产生不一致的数据

答案 2 :(得分:0)

您需要创建一个唯一的密钥{房间号,日期},以便每个房间每个日期只能预订一个。然后,客户预订将成为与预订中的天数一样多的行的插入,在交易中执行。

线程与它几乎无关。