有如下表:
select
*from tt;
+----+-------+
| id |
value|+
----+-------+|1
|1|+
----+-------+
有如下方法:
@transactional
(rollbackfor = exception.
class
, isolation = isolation.read_committed)
public
intincreandget
(int id)
@update
("update tt set value=value+1 where id=#"
)public
void
incre
(int id)
;@select
("select value from tt where id=#"
)public
intget
(int id)
;
請問上述方法有執行緒安全問題麼?
比如兩個執行緒同時執行 increandget(1),有沒有可能都返回3呢?
會不會如下執行呢?
value
執行緒1執行緒212
update tt set value=value+1
3update tt set value=value+1
3select value from tt
3select value from tt
答案是否定的,因為increandget開啟了事務,並且update語句會加鎖,但是釋放鎖並不是執行完updat後立刻釋放,而是在整個事務提交時釋放,所以第二個執行緒執行incre時會被阻塞,直到第乙個執行緒從increandget方法返回,執行緒二才能從incre方法返回繼續執行。
事務在需要加鎖時加鎖,但直到事務提交時才釋放鎖,這就是兩階段鎖協議。
兩階段提交事務
2pc two phase commitment protocol 兩階段提交協議 實現分布式事務的關鍵就是兩階段提交協議。在此協議中,乙個或多個資源管理器的活動均由乙個稱為事務協調器的單獨軟體元件來控制。此協議中的五個步驟如下 應用程式呼叫事務協調器中的提交方法。事務協調器將聯絡事務中涉及的每個資...
mysql5 7兩階段提交 mysql兩階段提交
1.兩階段提交 mysql中經常說的wal技術,wal的全稱是write ahead logging,它的關鍵點就是先寫日誌,再寫磁碟。即當有一條記錄需要更新時,innodb引擎就會先把記錄寫到redo log裡,並更新記憶體,這個時候更新就完成了。因為如果每一次的更新操作都需要寫進磁碟,然後磁碟也...
mysql兩階段鎖協議 MySql 兩階段加鎖協議
mysql 兩階段加鎖協議 前言此篇部落格主要是講述mysql 僅限innodb 的兩階段加鎖 2pl 協議,而非兩階段提交 2pc 協議,區別如下 2pl,兩階段加鎖協議 主要用於單機事務中的一致性與隔離性。2pc,兩階段提交協議 主要用於分布式事務。mysql本身針對性能,還有乙個mvcc 多版...