2014-12-06 38 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

共享數據,您需要創建一個獨特的鍵{房號,日期}這樣的房間只能有一個預訂每日期。然後,客戶預訂成爲插入行數,因爲在預訂中有幾天會在交易中進行。

線程真的與它沒有多大關係。

相關問題