摘要:一致性一個(gè)事務(wù)中,事務(wù)前后數(shù)據(jù)的完整性必須保持一致。持久性持久性是指一個(gè)事務(wù)一旦被提交,它對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的改變就是永久性的,接下來(lái)即使數(shù)據(jù)庫(kù)發(fā)生故障也不應(yīng)該對(duì)其有任何影響。
一、事務(wù)概述
1.什么是事務(wù)
一件事情有n個(gè)組成單元 要不這n個(gè)組成單元同時(shí)成功 要不n個(gè)單元就同時(shí)失敗
就是將n個(gè)組成單元放到一個(gè)事務(wù)中
2.mysql的事務(wù)
默認(rèn)的事務(wù):一條sql語(yǔ)句就是一個(gè)事務(wù) 默認(rèn)就開(kāi)啟事務(wù)并提交事務(wù)
手動(dòng)事務(wù):
1)顯示的開(kāi)啟一個(gè)事務(wù):start transaction
2)事務(wù)提交:commit代表從開(kāi)啟事務(wù)到事務(wù)提交 中間的所有的sql都認(rèn)為有效 真正的更新數(shù)據(jù)庫(kù)
3)事務(wù)的回滾:rollback 代表事務(wù)的回滾 從開(kāi)啟事務(wù)到事務(wù)回滾 中間的所有的 sql操作都認(rèn)為無(wú)效數(shù)據(jù)庫(kù)沒(méi)有被更新
二、JDBC事務(wù)操作
默認(rèn)是自動(dòng)事務(wù):
執(zhí)行sql語(yǔ)句:executeUpdate() ---- 每執(zhí)行一次executeUpdate方法 代表 事務(wù)自動(dòng)提交
通過(guò)jdbc的API手動(dòng)事務(wù):
開(kāi)啟事務(wù):conn.setAutoComnmit(false);
提交事務(wù):conn.commit();
回滾事務(wù):conn.rollback();
注意:控制事務(wù)的connnection必須是同一個(gè)
執(zhí)行sql的connection與開(kāi)啟事務(wù)的connnection必須是同一個(gè)才能對(duì)事務(wù)進(jìn)行控制
三、DBUtils事務(wù)操作
1.QueryRunner
有參構(gòu)造:QueryRunner runner = new QueryRunner(DataSource dataSource);
有參構(gòu)造將數(shù)據(jù)源(連接池)作為參數(shù)傳入QueryRunner,QueryRunner會(huì)從連 接池中獲得一個(gè)數(shù)據(jù)庫(kù)連接資源操作數(shù)據(jù)庫(kù),所以直接使用無(wú)Connection參數(shù) 的update方法即可操作數(shù)據(jù)庫(kù)
無(wú)參構(gòu)造:QueryRunner runner = new QueryRunner();
無(wú)參的構(gòu)造沒(méi)有將數(shù)據(jù)源(連接池)作為參數(shù)傳入QueryRunner,那么我們?cè)谑? 用QueryRunner對(duì)象操作數(shù)據(jù)庫(kù)時(shí)要使用有Connection參數(shù)的方法
四、使用ThreadLocal綁定連接資源
五、事務(wù)的特性和隔離級(jí)別(概念性問(wèn)題---面試)
1.事務(wù)的特性ACID
? 1)原子性(Atomicity)原子性是指事務(wù)是一個(gè)不可分割的工作單位,事務(wù)中的操作 要么都發(fā)生,要么都不發(fā)生。?
? 2)一致性(Consistency)一個(gè)事務(wù)中,事務(wù)前后數(shù)據(jù)的完整性必須保持一致。
? 3)隔離性(Isolation)多個(gè)事務(wù),事務(wù)的隔離性是指多個(gè)用戶并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)時(shí), 一個(gè)用戶的 事務(wù)不能被其它用戶的事務(wù)所干擾,多個(gè)并發(fā)事務(wù)之間數(shù)據(jù)要相互隔離。
? 4)持久性(Durability)持久性是指一個(gè)事務(wù)一旦被提交,它對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的改變 就是永久性的,接下來(lái)即使數(shù)據(jù)庫(kù)發(fā)生故障也不應(yīng)該對(duì)其有任何影響。
2.并發(fā)訪問(wèn)問(wèn)題----由隔離性引起
如果不考慮隔離性,事務(wù)存在3中并發(fā)訪問(wèn)問(wèn)題。
1)臟讀:B事務(wù)讀取到了A事務(wù)尚未提交的數(shù)據(jù) ------ 要求B事務(wù)要讀取A事 務(wù)提交的數(shù)據(jù)
2)不可重復(fù)讀:一個(gè)事務(wù)中 兩次讀取的數(shù)據(jù)的內(nèi)容不一致 ----- 要求的是一個(gè)事 務(wù)中多次讀取時(shí)數(shù)據(jù)是一致的 --- unpdate
3)幻讀/虛讀:一個(gè)事務(wù)中 兩次讀取的數(shù)據(jù)的數(shù)量不一致 ----- 要求在一個(gè)事務(wù)多 次讀取的數(shù)據(jù)的數(shù)量是一致的 --insert delete
3.事務(wù)的隔離級(jí)別
1)read uncommitted : 讀取尚未提交的數(shù)據(jù) :哪個(gè)問(wèn)題都不能解決
2)read committed:讀取已經(jīng)提交的數(shù)據(jù) :可以解決臟讀 ---- oracle默認(rèn)的
3)repeatable read:重讀讀?。嚎梢越鉀Q臟讀 和 不可重復(fù)讀 ---mysql默認(rèn)的
4)serializable:串行化:可以解決 臟讀 不可重復(fù)讀 和 虛讀---相當(dāng)于鎖表
注意:mysql數(shù)據(jù)庫(kù)默認(rèn)的隔離級(jí)別
查看mysql數(shù)據(jù)庫(kù)默認(rèn)的隔離級(jí)別:select @@tx_isolation
設(shè)置mysql的隔離級(jí)別:set session transaction isolation level 設(shè)置事務(wù)隔離級(jí)別
總結(jié):
mysql的事務(wù)控制: 開(kāi)啟事務(wù):start transaction; 提交:commit; 回滾:rollback; JDBC事務(wù)控制: 開(kāi)啟事務(wù):conn.setAutoCommit(false); 提交:conn.commit(); 回滾:conn.rollback(); DBUtils的事務(wù)控制 也是通過(guò)jdbc ThreadLocal:實(shí)現(xiàn)的是通過(guò)線程綁定的方式傳遞參數(shù) 概念: 事務(wù)的特性ACID 并發(fā)問(wèn)題:臟讀、不可重讀、虛讀幻讀 解決并發(fā):設(shè)置隔離級(jí)別 read uncommitted read committed repeatable read (mysql默認(rèn)) serialazable 隔離級(jí)別的性能: read uncommitted>read committed>repeatable read>serialazable 安全性: read uncommitted
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72456.html
摘要:前言由于寫(xiě)的文章已經(jīng)是有點(diǎn)多了,為了自己和大家的檢索方便,于是我就做了這么一個(gè)博客導(dǎo)航。 前言 由于寫(xiě)的文章已經(jīng)是有點(diǎn)多了,為了自己和大家的檢索方便,于是我就做了這么一個(gè)博客導(dǎo)航。 由于更新比較頻繁,因此隔一段時(shí)間才會(huì)更新目錄導(dǎo)航哦~想要獲取最新原創(chuàng)的技術(shù)文章歡迎關(guān)注我的公眾號(hào):Java3y Java3y文章目錄導(dǎo)航 Java基礎(chǔ) 泛型就這么簡(jiǎn)單 注解就這么簡(jiǎn)單 Druid數(shù)據(jù)庫(kù)連接池...
摘要:簡(jiǎn)要言之往中填充的變量屬于當(dāng)前線程,該變量對(duì)其他線程而言是隔離的。在辦理時(shí)又告訴機(jī)構(gòu)來(lái),把我的身份證房產(chǎn)證學(xué)生證通通給他。 前言 今天要研究的是ThreadLocal,這個(gè)我在一年前學(xué)習(xí)JavaWeb基礎(chǔ)的時(shí)候接觸過(guò)一次,當(dāng)時(shí)在baidu搜出來(lái)的第一篇博文ThreadLocal,在評(píng)論下很多開(kāi)發(fā)者認(rèn)為那博主理解錯(cuò)誤,給出了很多有關(guān)的鏈接來(lái)指正(可原博主可能沒(méi)上博客了,一直沒(méi)做修改)。我...
摘要:寫(xiě)這篇總結(jié),主要是記錄下自己的學(xué)習(xí)經(jīng)歷,算是自己對(duì)知識(shí)的一個(gè)回顧。這個(gè)階段學(xué)習(xí)的時(shí)候,要學(xué)會(huì)使用開(kāi)發(fā)工具,比如或者來(lái)學(xué)習(xí)。這個(gè)階段需要自己對(duì)自己有很強(qiáng)的自律去學(xué)習(xí),不要看了一半就放棄了。 showImg(https://segmentfault.com/img/bVbaNtw?w=1232&h=822); 寫(xiě)這篇總結(jié),主要是記錄下自己的學(xué)習(xí)經(jīng)歷,算是自己對(duì)知識(shí)的一個(gè)回顧。也給想要學(xué)習(xí) ...
摘要:寫(xiě)這篇總結(jié),主要是記錄下自己的學(xué)習(xí)經(jīng)歷,算是自己對(duì)知識(shí)的一個(gè)回顧。這個(gè)階段學(xué)習(xí)的時(shí)候,要學(xué)會(huì)使用開(kāi)發(fā)工具,比如或者來(lái)學(xué)習(xí)。這個(gè)階段需要自己對(duì)自己有很強(qiáng)的自律去學(xué)習(xí),不要看了一半就放棄了。 showImg(https://segmentfault.com/img/bVbaNtw?w=1232&h=822); 寫(xiě)這篇總結(jié),主要是記錄下自己的學(xué)習(xí)經(jīng)歷,算是自己對(duì)知識(shí)的一個(gè)回顧。也給想要學(xué)習(xí) ...
閱讀 3409·2022-01-04 14:20
閱讀 3122·2021-09-22 15:08
閱讀 2211·2021-09-03 10:44
閱讀 2326·2019-08-30 15:44
閱讀 1503·2019-08-29 18:40
閱讀 2673·2019-08-29 17:09
閱讀 2998·2019-08-26 13:53
閱讀 3229·2019-08-26 13:37