【问题标题】:How to make SQL insert safely?如何安全地进行 SQL 插入?
【发布时间】:2015-02-04 17:48:37
【问题描述】:

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

我正在考虑如何以安全的方式将预订插入到我的数据库中。请求将通过我的网络服务从应用程序发送到 MySQL 数据库(托管在网络服务器上)。

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

但是,如果两个不同的人几乎同时点击“立即预订”,我如何确保他们不会预订同一个/最后一个房间。我考虑过使用 Synchornised 用于 java 方法,但如果不同手机上的一系列不同用户尝试进行预订,这会有什么不同吗?

【问题讨论】:

  • 了解 SQL 锁定

标签: android mysql multithreading thread-safety


【解决方案1】:

您正在寻找的是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】:

    我不认为你在询问线程,而是在询问避免竞争条件。

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

    【讨论】:

      【解决方案3】:

      您需要创建一个唯一键 {room number, date},这样一个房间每个日期只能有一个预订。然后,在事务中执行的客户预订将插入与预订天数一样多的行。

      线程确实与它无关。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-06-11
        • 1970-01-01
        • 2011-04-28
        • 2012-01-07
        • 2020-01-31
        • 2013-11-19
        • 2011-10-14
        • 1970-01-01
        相关资源
        最近更新 更多