第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

MySQL - JDBC - 同時(shí)選擇和刪除

MySQL - JDBC - 同時(shí)選擇和刪除

www說 2021-06-28 13:59:41
所以我的客戶端程序運(yùn)行此代碼以獲取行數(shù)據(jù)并在之后將其刪除。問題是在 SELECT 和 DELETE 之間有 60-130 毫秒的延遲,在這段時(shí)間內(nèi)另一個(gè)客戶端可能已經(jīng)抓取了同一行。有什么辦法可以同時(shí) SELECT 和 DELETE 來阻止這種沖突的發(fā)生?String filterQuery = "SELECT token_id FROM table WHERE expires <= ? LIMIT 1;";PreparedStatement preparedStmt = conn.prepareStatement(filterQuery);preparedStmt.setLong(1, System.currentTimeMillis());long startTime = System.currentTimeMillis();ResultSet result = preparedStmt.executeQuery();String token_id = null;while (result.next()) {    System.out.println(result.getString(1));    token_id = result.getString(1);}filterQuery = "DELETE FROM table WHERE token_id = ?;";preparedStmt = conn.prepareStatement(filterQuery);preparedStmt.setString(1, token_id);preparedStmt.execute();System.out.println(System.currentTimeMillis() - startTime+" milliseconds");
查看完整描述

2 回答

?
動(dòng)漫人物

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超10個(gè)贊

如果您希望 SELECT 阻止對(duì)該行的后續(xù)讀取,直到您將其刪除,那么正如馬克在他的評(píng)論中指出的那樣,您需要

  • 啟用事務(wù) ( setAutoCommit(false))

  • 將事務(wù)隔離設(shè)置為 SERIALIZABLE,并且

  • 用 SELECT ... FOR UPDATE

此示例代碼適用于我:

conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);

conn.setAutoCommit(false);


Statement st = conn.createStatement();

ResultSet rs = st.executeQuery("SELECT token_id FROM tokens ORDER BY token_id LIMIT 1 FOR UPDATE");

rs.next();

int token_id = rs.getInt("token_id");

System.out.printf("Got %d.%n", token_id);

PreparedStatement ps = conn.prepareStatement("DELETE FROM tokens WHERE token_id=?");

ps.setInt(1, token_id);

ps.executeUpdate();

conn.commit();


查看完整回答
反對(duì) 回復(fù) 2021-07-07
?
慕蓋茨4494581

TA貢獻(xiàn)1850條經(jīng)驗(yàn) 獲得超11個(gè)贊

編輯整個(gè)答案,因?yàn)槲艺`解了這個(gè)問題 XD


看一看 mySQL REPEATABLE READ,你的 SQ 代碼看起來像這樣


SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

START TRANSACTION;

SELECT token_id FROM table WHERE expires <= 'Example';

DELETE FROM table WHERE token_id = 'ExampleID!';

COMMIT;


查看完整回答
反對(duì) 回復(fù) 2021-07-07
  • 2 回答
  • 0 關(guān)注
  • 136 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)