當前位置:首頁 » 編程語言 » java資料庫加鎖

java資料庫加鎖

發布時間: 2025-02-15 01:34:14

1. java如何實現對Mysql資料庫的行鎖

下面通過一個例子來說明
場景如下:
用戶賬戶有餘額,當發生交易時,需要實時更新余額。這里如果發生並發問題,那麼會造成用戶余額和實際交易的不一致,這對公司和客戶來說都是很危險的。
那麼如何避免:
網上查了下,有以下兩種方法:
1、使用悲觀鎖
當需要變更余額時,通過代碼在事務中對當前需要更新的記錄設置for update行鎖,然後開始正常的查詢和更新操作
這樣,其他的事務只能等待該事務完成後方可操作
當然要特別注意,如果使用了Spring的事務註解,需要配置一下:

<!-- (事務管理)transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 使用annotation定義事務 -->
<tx:annotation-driven transaction-manager="transactionManager" />

在指定代碼處添加事務註解

@Transactional
@Override
public boolean increaseBalanceByLock(Long userId, BigDecimal amount)
throws ValidateException {
long time = System.currentTimeMillis();
//獲取對記錄的鎖定
UserBalance balance = userBalanceDao.getLock(userId);
LOGGER.info("[lock] start. time: {}", time);
if (null == balance) {
throw new ValidateException(
ValidateErrorCode.ERRORCODE_BALANCE_NOTEXIST,
"user balance is not exist");
}
boolean result = userBalanceDao.increaseBalanceByLock(balance, amount);
long timeEnd = System.currentTimeMillis();
LOGGER.info("[lock] end. time: {}", timeEnd);
return result;
}

MyBatis中的鎖定方式,實際測試該方法確實可以有效控制,不過在大並發量的情況下,可能會有性能問題吧
<select id="getLock" resultMap="BaseResultMap" parameterType="java.lang.Long">
<![CDATA[
select * from user_balance where id=#{id,jdbcType=BIGINT} for update;
]]>
</select>

2、使用樂觀鎖
這個方法也同樣可以解決場景中描述的問題(我認為比較適合並不頻繁的操作):
設計表的時候增加一個version(版本控制欄位),每次需要更新余額的時候,先獲取對象,update的時候根據version和id為條件去更新,如果更新回來的數量為0,說明version已經變更
需要重復一次更新操作,如下:sql腳本

update user_balance set Balance = #{balance,jdbcType=DECIMAL},Version = Version+1 where Id = #{id,jdbcType=BIGINT} and Version = #{version,jdbcType=BIGINT}

這是一種不使用資料庫鎖的方法,解決方式也很巧妙。當然,在大量並發的情況下,一次扣款需要重復多次的操作才能成功,還是有不足之處的。不知道還有沒有更好的方法。

熱點內容
androidso反編譯 發布:2025-02-15 20:29:43 瀏覽:487
xp查找共享文件夾 發布:2025-02-15 20:22:00 瀏覽:906
永康150公斤電子秤標定密碼是多少 發布:2025-02-15 20:15:12 瀏覽:41
任敏編程 發布:2025-02-15 20:00:25 瀏覽:776
log4cxx編譯 發布:2025-02-15 19:58:42 瀏覽:688
代辦車貸解壓 發布:2025-02-15 19:44:55 瀏覽:75
伺服器ip地址獲取異常 發布:2025-02-15 19:43:43 瀏覽:55
最新倫理歐美ftp 發布:2025-02-15 19:30:54 瀏覽:409
阿里雲伺服器設置域名 發布:2025-02-15 19:15:27 瀏覽:369
如何在電腦上查看舊路由器密碼 發布:2025-02-15 19:11:21 瀏覽:808