成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

圖解 & 深入淺出JavaWeb:事務必會必知

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

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

一、數據庫事務

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

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

二、ACID

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

a)原子性

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

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

  1. BEGIN TRANSACTION
  2.   
  3. INSERT INTO `test`.`city` (`state`, `country`, `name`) 
  4.   
  5. VALUES 
  6.   
  7. ('1''China''CHINA','錯誤語句多了個VALUE'); 
  8.   
  9. INSERT INTO `test`.`city` (`state`, `country`, `name`) 
  10.   
  11. VALUES 
  12.   
  13. ('1''China''CHINA'); 
  14.   
  15. 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,代碼如下:

  1. public class TransactionLevels extends BaseJDBC { 
  2.     public static void main(String[] args) { 
  3.         try { 
  4.             // 加載數據庫驅動 
  5.             Class.forName(DRIVER); 
  6.             // 數據庫連接 
  7.             Connection conn = DriverManager.getConnection(URL,USER,PWD); 
  8.             // 數據庫元數據 
  9.             DatabaseMetaData metaData = conn.getMetaData(); 
  10.   
  11.             // 是否支持事務 
  12.             boolean isSupport = metaData.supportsTransactions(); 
  13.             System.out.println(isSupport); 
  14.             // 是否支持的事務 
  15.             boolean isSupportLevel = metaData.supportsTransactionIsolationLevel(Connection.TRANSACTION_SERIALIZABLE); 
  16.             System.out.println(isSupportLevel); 
  17.             // 獲取默認事務 
  18.             int defaultIsolation = metaData.getDefaultTransactionIsolation(); 
  19.             System.out.println(defaultIsolation); 
  20.   
  21.             /** 關閉數據庫連接 */ 
  22.             if (conn != null) { 
  23.                 try { 
  24.                     conn.close(); 
  25.                 } catch (SQLException e) { 
  26.                     e.printStackTrace(); 
  27.                 } 
  28.             } 
  29.         } catch (Exception e) { 
  30.             e.printStackTrace(); 
  31.         } 
  32.   
  33.     } 

第 5、7行是連接數據庫

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

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

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

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

具體源碼如下:

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

【本文為51CTO專欄作者“李強強”的原創稿件,轉載請通過51CTO聯系作者獲取授權】 

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2011-07-04 10:39:57

Web

2021-03-16 08:54:35

AQSAbstractQueJava

2011-01-27 10:11:46

J2EEjavaspring

2022-09-26 09:01:15

語言數據JavaScript

2019-01-07 15:29:07

HadoopYarn架構調度器

2021-07-20 15:20:02

FlatBuffers阿里云Java

2017-07-02 18:04:53

塊加密算法AES算法

2012-05-21 10:06:26

FrameworkCocoa

2023-12-04 13:22:00

JavaScript異步編程

2016-10-14 14:32:58

JavascriptDOMWeb

2009-11-17 17:31:58

Oracle COMM

2010-07-16 09:11:40

JavaScript內存泄漏

2010-07-26 12:57:12

OPhone游戲開發

2021-07-19 11:54:15

MySQL優先隊列

2016-10-14 13:53:05

JavascriptDOMWeb

2024-01-09 12:05:24

SSH協議端口

2009-11-30 16:46:29

學習Linux

2012-02-21 13:55:45

JavaScript

2022-01-11 07:52:22

CSS 技巧代碼重構

2018-11-09 16:24:25

物聯網云計算云系統
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久成人人人人精品欧 | 日本天堂一区 | 一本一道久久a久久精品蜜桃 | 日韩在线一区二区三区 | 视频一区二区三区在线观看 | 国产视频中文字幕 | 逼逼网| 五月婷婷丁香婷婷 | 免费观看一级黄色录像 | 国产精品高潮呻吟久久av野狼 | 一级午夜aaa免费看三区 | av在线免费观看网址 | 日韩av在线中文字幕 | 亚洲精品一区二区三区在线 | 夜夜爽99久久国产综合精品女不卡 | 毛片视频网站 | 日韩福利一区 | 国产精品久久一区二区三区 | 久久久观看 | 国产精品久久久久久久久大全 | 色婷婷综合在线观看 | 在线观看国产视频 | 日韩一区二区在线视频 | 久久久久国产精品一区 | 亚洲精品福利在线 | 中文字幕亚洲无线 | 精品国产一级片 | 日韩在线看片 | 久色网| 99久久婷婷 | 免费视频久久久久 | 欧洲亚洲精品久久久久 | 在线视频一区二区三区 | 在线中文字幕第一页 | 欧美国产日本一区 | 亚洲日本激情 | 色射综合| 真人一级毛片 | 91视视频在线观看入口直接观看 | 亚洲视频一区 | 91久久国产综合久久 |