Java中的資料事務操作概述

2021-07-06 01:15:21 字數 1748 閱讀 2200

資料庫的四大隔離級別:

read uncommitted; 資料庫不做任何隔離性控制,資料庫具有髒讀、不可重複讀和虛讀(幻讀)問題。

read committed; 資料庫可以防止髒讀問題,具有不可重複讀和虛讀(幻讀)問題

repeatable read; 資料庫可以防止髒讀、不可重複讀,具有虛讀(幻讀)問題

serializable; 資料庫將會處在序列化,可以防止所有隔離性的問題,但是效能非常低下。

從安全性上考慮:

serializable > repeatable read > read committed > read uncommitted

從效率上考慮:

read uncommitted > read committed >repeatable read > serializable

資料庫的使用者應該根據自己的業務需求選擇乙個在能夠防止想要防止的問題的基礎上效能最高的乙個隔離級別。

mysql的預設隔離級別repeatable read

select @@tx_isolation; 查詢隔離級別

set session/global transaction isolation level ******x; 修改隔離級別

**如果寫session改變的是當前客戶端和資料庫進行互動時使用的隔離級別

**如果寫global當前客戶端和資料庫進行互動時的隔離級別不變,改變的是資料庫預設的隔離級別,影響新開的客戶端和資料庫互動時採用的預設的隔離的級別。

資料庫中的鎖:

共享鎖:在非serializable隔離級別下,查詢不加任何鎖,在serializable隔離級別下查詢加共享鎖。

共享鎖和共享鎖可以共存,共享鎖和排他鎖不能共存。

排他鎖:在任何隔離級別下進行增刪改都會加排他鎖

排他鎖和任意鎖都不能共存。

兩個併發的修改: 無論任何隔離級別 增刪改都加排他 兩個排他不能共存 可以保證兩個併發的修改一定隔離開

兩個併發的查詢: 無論什麼情況都可以併發查詢

非serializable 非serializable 兩個都不加鎖 可以共存,併發查詢

serializable 非serializable 乙個加共享鎖 另乙個不加鎖 可以共存,併發查詢

serializable serializable 兩個都加共享鎖 可以共存,併發查詢

乙個修改,乙個查詢:serializable的工作機制:

乙個查詢加了共享鎖 ,其他修改試圖加排他,由於共享和排他不能共存,只能等待,自然就不會造成隔離性問題。

五、更新丟失問題

更新丟失問題:兩個併發的執行緒基於同乙個查詢結果進行修改,後提交的事務忽略了先提交的事務對資料庫的影響,產生更新丟失問題。

例子:重複充值的案例

例子:小芳的例子

解決方案:

將資料庫設定位serializable隔離級別就可以原生的防止更新丟失問題,但是serializable效能低下,一般不會將資料庫的隔離級別設定位serializable

在非serializable隔離級別下:

悲觀鎖:悲觀鎖悲觀認為每次查詢都會造成更新丟失,所以在查詢時手動加排他鎖,從而防止其他併發事務的查詢/修改,從而防止更新丟失問題。

select * from user for update;

樂觀鎖:樂觀鎖樂觀的認為,每次更新都不會造成更新丟失,正常的查詢和更新,只有檢測到發生了更新丟失,才進行補救。樂觀鎖通常通過資料庫中增加乙個版本欄位來工作。

如果查詢比較多,更新比較少,用樂觀鎖。如果更新比較多,而查詢比較少用悲觀鎖。

Java事務 一 概述

一.什麼是事務 所謂事務,就是針對資料庫的一組操作 多條sql 位於同乙個事務的操作具備同步的特點,也就是要麼都成功,要麼都失敗 二.事務的作用 在實際中,我們的很多操作都是需要由多條sql來共同完成的,例如,a賬戶給b賬戶轉賬就會對應兩條sql update account set money m...

java中的事務

一 什麼是事務 事務是訪問資料庫的乙個操作序列,資料庫應用系統通過事務集來完成對資料庫的訪問。事務的正確執行使得資料庫從一種狀態轉換成另一種狀態。事務必須服從iso iec所制定的acid原則。acid是原子性 atomicity 一致性 consistency 隔離性 isolation 和永續性...

Java中的事務

在事務中的多個操作,要麼都成功,要麼都失敗 通過 c.setautocommit false 關閉自動提交 使用 c.commit 進行手動提交 在mysql中,只有當表的型別是innodb的時候,才支援事務,所以需要把錶的型別設定為innodb,否則無法觀察到事務.修改表的型別為innodb的sq...