2014-02-17 64 views
0

下面的jdbcTemplate更新腳本是線程安全的嗎?它的作用主要是:Spring JdbcTemplate是更新原子嗎?

balance -= amount; 

下面是代碼:

String sql = "update player.playerbalance b set b.balance = (b.balance - ?) where b.id = ? and b.balance >= ?"; 

jdbcTemplate = new JdbcTemplate(dataSource); 

int i = jdbcTemplate.update(
      sql, 
      new Object[] {wager, playerBalance.getId(), wager}); 

如果這樣的兩個更新發生在同一時間,會發生什麼?

謝謝,

+0

,你會得到一個異常:'javax.persistence.OptimisticLockException'或'OptimisticLockingFailureException'或其他.. – Jaiwo99

+0

但我並沒有明確定義鎖.. – Urbanleg

+1

@ Jaiwo99我懷疑你會得到這樣的異常,因爲沒有樂觀併發檢查這裏 –

回答

0

它與線程安全無關。該調用應該是線程安全的。

DBMS將會非常聰明,以確保在相同記錄的其他更新進入之前完成一次更新(除非您已將隔離級別設置得非常低)。因此,如果兩個線程(或進程等)調用同一個方法兩次(使用相同的餘額ID),則相同的記錄將被扣除兩次。

+0

如何確保我的隔離級別該任務是否合法? – Urbanleg