久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

如何深入解析JavaWeb中的事務

153次閱讀
沒有評論

共計 2943 個字符,預計需要花費 8 分鐘才能閱讀完成。

如何深入解析 JavaWeb 中的事務,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

事務,大家所熟悉的事務(Transcation),基本上會就往 Spring 事務靠。其實 Spring 事務管理基于底層數據庫本身的事務處理機制。數據庫事務的基礎,是掌握 Spring 事務管理的基礎。下面總結一下數據庫事務。

一、數據庫事務

它的思想:we are 伐木累。就是多個 SQL 語句(一個團隊),要么所有執行 success,不然就 fail。

它最終的目標:數據不會被破壞。即事務操作成功,數據的結果和業務期待的結果是一致的。這也就是 ACID 中的一致性(Consistency)。那什么是 ACID 呢?

二、ACID

上面是思想,牛人馬上根據思想建模,DBMS 中數據庫事務滿足 4 各特性,即原子性、一致性、隔離性和持久性。下面一一生動解釋:

a)原子性

原子是物質的最小單元,即不可再分。

例如,以 MySQL 為例,每一個簡單的 SQL 語句即包含在一個事務中,具有原子性。這時候有人問了,那多個 SQL 呢?

BEGIN TRANSACTION; INSERT INTO `test`.`city` (`state`, `country`, `name`) VALUES (1 ,  China ,  CHINA , 錯誤語句多了個 VALUE  INSERT INTO `test`.`city` (`state`, `country`, `name`) VALUES (1 ,  China ,  CHINA  COMMIT;

結果:執行不通過。行 3 -5:為一個錯誤 SQL。行 6 -8:是一個正確的 SQL。它們各自被包裹在各自的隱式事務中,即 Read  Uncommited。T-all 包裹了上面具有原子性的 T - 1 和 T -2,實現了更大的原子,如下圖。

b)一致性

*** 目標:數據不會被破壞。(這不是廢話? 確實有點)具體說,事務操作成功后,數據庫所處的狀態和它的業務規則是一致的,即數據不會被破壞。舉個栗子:兩句 UPDATE 語句,從 A 賬戶轉賬到 B 賬戶,不管成功失敗,A 和 B 賬戶的總額是不變的。

c)隔離性

隔離:表示互不干擾。事務與事務之間無法干擾,即每個事務獨立,不會交叉。這樣可以讓多個線程并發訪問數據庫。如圖:

但是聰明的小伙伴知道,如果事務完全隔離,每次只允許一個事務能訪問數據庫,那其他都是阻塞。會非常慢。

但是聰明的小伙伴也知道,這樣會造成數據的并發問題。(是的,在下面第三節講)。

d)持久性

數據必須持久化到數據庫 (存儲在磁盤) 中。已提交的事務,即使在提交后數據庫崩潰,重啟數據庫時也能夠根據日志對未持久化的數據進行重執行操作。(同學會問,那沒提交的事務呢? 那就悲劇了( ﹏))

小結:數據的一致性是最終目標,其他特性都是其要求或手段。

三、隔離性中的問題:臟讀、不可重復讀和幻讀

對應上面的隔離性,事務并發訪問的時候會出現:臟讀、不可重復讀和幻讀。案例轉自勇哥博客

臟讀:A 事務讀取了 B 事務未提交的更改數據。一般數據庫事務默認不允許該問題出現。

比如這里查詢應該是 1500,現在出現了臟讀。

時間事務 A(存款)事務 B(取款)

T1 開始事務

T2

開始事務

T3

查詢余額(1000 元)

T4

取出 1000 元(余額 0 元)

T5 查詢余額(0 元)

T6

撤銷事務(余額恢復為 1000 元)

T7 存入 500 元(余額 500 元)

T8 提交事務

不可重復讀:A 事務讀取了 B 事務已提交的更改數據。

幻讀:A 事務讀取了 B 事務提交的新增數據。

上面的案例腦補吧,主要還是看下面。

不可重復讀和幻讀區別:一個更改,一個新增數據。其實兩個區別在于一個是新增(insert 語句),處理幻讀這個操作需要加表級別的鎖,將整個表鎖定,防止新增數據造成幻讀。另一個則是更改(update  delete),這時候避免這個情況只需要添加行級鎖組織該行發生變化即可。

四、事務隔離級別

既要求高的隔離性(安全性),又要求高并發性。這種是不可能的任務。根據各種鎖的操作機制出現了一個事務隔離級別。即相同情況下的輸入,不同隔離級別結果不同。為啥了,當然是在并發性和安全性的抉擇。如圖:

按著圖說的,根據程序的并發性和安全性的抉擇。魚和熊掌不可兼得也~ 但分布式的時候,可以吧安全性關鍵的單獨分布式鎖。

好了,案例說了很多下面代碼實戰。

這段代碼地址:https://github.com/JeffLi1993/jee-component-learning

五、JDBC 事務實戰

下面利用 MYSQL JDBC 驅動連接 MySQL,代碼如下:

public class TransactionLevels extends BaseJDBC { public static void main(String[] args) { try { //  加載數據庫驅動  Class.forName(DRIVER); //  數據庫連接  Connection conn = DriverManager.getConnection(URL,USER,PWD); //  數據庫元數據  DatabaseMetaData metaData = conn.getMetaData(); //  是否支持事務  boolean isSupport = metaData.supportsTransactions(); System.out.println(isSupport); //  是否支持的事務  boolean isSupportLevel = metaData.supportsTransactionIsolationLevel(Connection.TRANSACTION_SERIALIZABLE); System.out.println(isSupportLevel); //  獲取默認事務  int defaultIsolation = metaData.getDefaultTransactionIsolation(); System.out.println(defaultIsolation); /**  關閉數據庫連接  */ if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } catch (Exception e) { e.printStackTrace(); } } }

第 5、7 行是連接數據庫

第 9 行:獲取數據庫元數據,這是包含數據庫連接信息

第 12 行:從元數據中,判斷是否支持事務

第 15 行:從元數據中,判斷是否支持事務級別 TRANSACTION_SERIALIZABLE

第 18 行:這里可以看出 MySQL 默認支持的事務級別是 READ_COMMITTED,默認會隔離臟讀。

具體源碼如下:

因此在安全性要求不高,支持高并發的情況下,選擇 MySQL 默認事務等級。但在安全性極高,幾乎不會出現高并發情況下,選擇更高的事務等級。根據上小節的圖一幕了然。

看完上述內容,你們掌握如何深入解析 JavaWeb 中的事務的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注丸趣 TV 行業資訊頻道,感謝各位的閱讀!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-19發表,共計2943字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 临高县| 安仁县| 城固县| 胶州市| 丘北县| 新乐市| 斗六市| 涟源市| 万安县| 乌拉特中旗| 玉林市| 金华市| 怀仁县| 广汉市| 和顺县| 武城县| 清涧县| 肥乡县| 泗水县| 兰州市| 宜兰市| 宁波市| 炉霍县| 阜新| 崇礼县| 寻乌县| 溆浦县| 太和县| 徐闻县| 康定县| 眉山市| 吉安县| 灌云县| 扎赉特旗| 微博| 阜新| 湖南省| 鄂托克前旗| 嘉祥县| 辽阳县| 张掖市|