真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何深入解析JavaWeb中的事務(wù)

如何深入解析JavaWeb中的事務(wù),相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

我們提供的服務(wù)有:網(wǎng)站制作、網(wǎng)站建設(shè)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、仲巴ssl等。為上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的仲巴網(wǎng)站制作公司

事務(wù),大家所熟悉的事務(wù)(Transcation),基本上會(huì)就往Spring事務(wù)靠。其實(shí)Spring事務(wù)管理基于底層數(shù)據(jù)庫(kù)本身的事務(wù)處理機(jī)制。數(shù)據(jù)庫(kù)事務(wù)的基礎(chǔ),是掌握Spring事務(wù)管理的基礎(chǔ)。下面總結(jié)一下數(shù)據(jù)庫(kù)事務(wù)。

一、數(shù)據(jù)庫(kù)事務(wù)

它的思想:we are 伐木累。就是多個(gè)SQL語(yǔ)句(一個(gè)團(tuán)隊(duì)),要么所有執(zhí)行success,不然就fail。

它最終的目標(biāo):數(shù)據(jù)不會(huì)被破壞。即事務(wù)操作成功,數(shù)據(jù)的結(jié)果和業(yè)務(wù)期待的結(jié)果是一致的。這也就是ACID中的一致性(Consistency)。那什么是ACID呢?

二、ACID

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

a)原子性

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

例如,以MySQL為例,每一個(gè)簡(jiǎn)單的 SQL 語(yǔ)句即包含在一個(gè)事務(wù)中,具有原子性。這時(shí)候有人問了,那多個(gè)SQL呢?

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

結(jié)果:執(zhí)行不通過。行3-5:為一個(gè)錯(cuò)誤SQL。行6-8:是一個(gè)正確的SQL。它們各自被包裹在各自的隱式事務(wù)中,即Read  Uncommited。T-all包裹了上面具有原子性的T-1和T-2,實(shí)現(xiàn)了更大的原子,如下圖。

如何深入解析JavaWeb中的事務(wù)

b)一致性

***目標(biāo):數(shù)據(jù)不會(huì)被破壞。(這不是廢話?確實(shí)有點(diǎn))具體說,事務(wù)操作成功后,數(shù)據(jù)庫(kù)所處的狀態(tài)和它的業(yè)務(wù)規(guī)則是一致的,即數(shù)據(jù)不會(huì)被破壞。舉個(gè)栗子:兩句UPDATE語(yǔ)句,從A賬戶轉(zhuǎn)賬到B賬戶,不管成功失敗,A和B賬戶的總額是不變的。

c)隔離性

隔離:表示互不干擾。事務(wù)與事務(wù)之間無法干擾,即每個(gè)事務(wù)獨(dú)立,不會(huì)交叉。這樣可以讓多個(gè)線程并發(fā)訪問數(shù)據(jù)庫(kù)。如圖:

如何深入解析JavaWeb中的事務(wù)

但是聰明的小伙伴知道,如果事務(wù)完全隔離,每次只允許一個(gè)事務(wù)能訪問數(shù)據(jù)庫(kù),那其他都是阻塞。會(huì)非常慢。

但是聰明的小伙伴也知道,這樣會(huì)造成數(shù)據(jù)的并發(fā)問題。(是的,在下面第三節(jié)講)。

d)持久性

數(shù)據(jù)必須持久化到數(shù)據(jù)庫(kù)(存儲(chǔ)在磁盤)中。已提交的事務(wù),即使在提交后數(shù)據(jù)庫(kù)崩潰,重啟數(shù)據(jù)庫(kù)時(shí)也能夠根據(jù)日志對(duì)未持久化的數(shù)據(jù)進(jìn)行重執(zhí)行操作。(同學(xué)會(huì)問,那沒提交的事務(wù)呢?那就悲劇了(>﹏<))

小結(jié):數(shù)據(jù)的一致性是最終目標(biāo),其他特性都是其要求或手段。

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

對(duì)應(yīng)上面的隔離性,事務(wù)并發(fā)訪問的時(shí)候會(huì)出現(xiàn):臟讀、不可重復(fù)讀和幻讀。案例轉(zhuǎn)自勇哥博客

臟讀:A事務(wù)讀取了B事務(wù)未提交的更改數(shù)據(jù)。一般數(shù)據(jù)庫(kù)事務(wù)默認(rèn)不允許該問題出現(xiàn)。

比如這里查詢應(yīng)該是1500,現(xiàn)在出現(xiàn)了臟讀。

時(shí)間事務(wù) A(存款)事務(wù) B(取款)

T1開始事務(wù)

T2

開始事務(wù)

T3

查詢余額(1000 元)

T4

取出 1000 元(余額 0 元)

T5查詢余額(0 元)

T6

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

T7存入 500 元(余額 500 元)

T8提交事務(wù)

不可重復(fù)讀:A事務(wù)讀取了B事務(wù)已提交的更改數(shù)據(jù)。

幻讀:A事務(wù)讀取了B事務(wù)提交的新增數(shù)據(jù)。

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

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

四、事務(wù)隔離級(jí)別

既要求高的隔離性(安全性),又要求高并發(fā)性。這種是不可能的任務(wù)。根據(jù)各種鎖的操作機(jī)制出現(xiàn)了一個(gè)事務(wù)隔離級(jí)別。即相同情況下的輸入,不同隔離級(jí)別結(jié)果不同。為啥了,當(dāng)然是在并發(fā)性和安全性的抉擇。如圖:

如何深入解析JavaWeb中的事務(wù)

按著圖說的,根據(jù)程序的并發(fā)性和安全性的抉擇。魚和熊掌不可兼得也~ 但分布式的時(shí)候,可以吧安全性關(guān)鍵的單獨(dú)分布式鎖。

好了,案例說了很多下面代碼實(shí)戰(zhàn)。

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

五 、JDBC事務(wù)實(shí)戰(zhàn)

下面利用MYSQL JDBC驅(qū)動(dòng)連接MySQL,代碼如下:

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

第 5、7行是連接數(shù)據(jù)庫(kù)

第 9 行:獲取數(shù)據(jù)庫(kù)元數(shù)據(jù),這是包含數(shù)據(jù)庫(kù)連接信息

第 12 行:從元數(shù)據(jù)中,判斷是否支持事務(wù)

第 15 行:從元數(shù)據(jù)中,判斷是否支持事務(wù)級(jí)別 TRANSACTION_SERIALIZABLE

第 18 行:這里可以看出MySQL默認(rèn)支持的事務(wù)級(jí)別是 READ_COMMITTED,默認(rèn)會(huì)隔離臟讀。

具體源碼如下:

如何深入解析JavaWeb中的事務(wù)

因此在安全性要求不高,支持高并發(fā)的情況下,選擇MySQL默認(rèn)事務(wù)等級(jí)。但在安全性極高,幾乎不會(huì)出現(xiàn)高并發(fā)情況下,選擇更高的事務(wù)等級(jí)。根據(jù)上小節(jié)的圖一幕了然。

看完上述內(nèi)容,你們掌握如何深入解析JavaWeb中的事務(wù)的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


文章名稱:如何深入解析JavaWeb中的事務(wù)
網(wǎng)站地址:http://weahome.cn/article/ipdcji.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部