我有一個關於數據庫事務的問題,我不確定我的理解是否正確。我想在Java應用程序中實現用戶登錄。由於可能有多個服務器在同一個數據庫上運行,並且每個用戶只能登錄其中一個服務器,所以如果用戶已經登錄,數據庫必須存儲一個標誌。實現用戶登錄,JDBC Transactions問題
因此,假設下列表結構:
如果他沒有登錄ID | User | PWD | Server
其中Server
是參照其中用戶在其登錄服務器,或NULL
。
當,我得先檢查服務器是否值是一個用戶登錄NULL,如果不是,則將其設置爲對應參考值。但是,在用戶登錄另一臺服務器的這兩條語句之間發生了什麼?交易可以檢測到這種情況嗎?例如(僞)
conn.setAutoCommit(false);
ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM users WHERE user = 'usr' AND password = 'pwd'");
if (rs.next()) {
rs.getInt("Server");
if (rs.wasNull()) {
// Not logged in
conn.createStatement().execute("UPDATE users SET server = 123 WHERE user = 'usr' AND password = 'pwd'");
conn.commit();
}
} else {
// Usr/Pwd wrong
}
conn.rollback();
如果用戶在另一臺服務器上的select和update語句之間登錄,會發生什麼?由於在交易過程中表被其他人更改了表單,或者表單執行失敗了,提交失敗了嗎?
我應該更好地使用像
UPDATE users SET server = 123 WHERE user = 'usr' AND pwd = 'pwd' AND server IS NULL
的方法,並檢查0行受到影響?如果是這樣,我必須檢查用戶是否存在於查詢中。
使用INSERT註冊新用戶時出現類似問題。應該使用事務方法,還是將用戶列聲明爲UNIQUE並捕獲SQL異常?
感謝您的鏈接。當然,我不會存儲純文本PWD ...用於處理崩潰:服務器檢測套接字連接何時關閉,因此可以在此時註銷用戶。 – 2011-02-25 15:34:25
太棒了,只是覺得我會提到它是安全的。 – 2011-02-25 15:37:16