摘要:只有在事務(wù)確定正確提交之后,才會顯示該事務(wù)對數(shù)據(jù)的改變。不允許不一致現(xiàn)象的出現(xiàn)。
@[TOC]
為什么寫這系列的文章在日常的工作和開發(fā)中,接觸最多的便是與數(shù)據(jù)庫打交道,無論你使用什么框架進行開發(fā)都繞不開事務(wù)的管理. 在Java開發(fā)中你可能會接觸很多ORM框架,無論是Hibernate、MyBatis、還是Spring Jdbc 都會遇到事務(wù)的相關(guān)操作,再到中大型項目,你還會遇到單一數(shù)據(jù)源本地事務(wù)、多數(shù)據(jù)源本地事務(wù)、分布式事務(wù)、分布式多數(shù)據(jù)源事務(wù)等各種奇葩環(huán)境,數(shù)據(jù)的一致性也會面臨各種挑戰(zhàn),在這時如何游刃有余的處理數(shù)據(jù)一致性就考驗?zāi)銓κ聞?wù)的理解,也正是這系列文章寫作的真正原因.
由于我換工作原因,先后在峰鳥科技、人人網(wǎng)、國家電網(wǎng)待過一段時間,先后接觸了不同的ORM框架
峰鳥科技
在這里由于SQL比較靈活,同時考慮到性能問題,這里直接使用的Spring JDBC,為了提高開發(fā)效率,我也開發(fā)了一個簡單ORM框架,用來將javabean 和 數(shù)據(jù)庫表信息進行關(guān)聯(lián),提供了簡單的增刪改查和分頁功能,這時候也是我初步接觸框架的開發(fā),接觸反射、代理等功能
人人網(wǎng)
在這里先后使用 Python 和 Java 進行開發(fā),用過MyBatis、Django-orm、sqlalchemy、JPA、Jade等ORM框架。其中Jade是人人網(wǎng)自行開發(fā)的ORM框架,使用簡單,支持條件化語句、支持多數(shù)據(jù)源切換和多數(shù)據(jù)源事務(wù)功能,相對MyBatis來說,使用方式和功能更加友好,強大。
國家電網(wǎng)
在這里主要使用的MyBaits,第一次看見Spring事務(wù)注解可以添加到類上而不是方法上,這也說明你懂的還是不多
通過不同的經(jīng)歷,也先后接觸到了JDBC事務(wù)、Spring事務(wù)、Hibernate事務(wù)、MyBaits事務(wù)、多數(shù)據(jù)源事務(wù)、分布式事務(wù)的使用和解決方案,這里總結(jié)一下
事務(wù)概念事務(wù)(Transaction):一般是指要做的或所做的事情。在計算機術(shù)語中是指訪問并可能更新數(shù)據(jù)庫中各種數(shù)據(jù)項的一個程序執(zhí)行單元(unit)。
數(shù)據(jù)庫事務(wù)(Database Transaction):是指作為單個邏輯工作單元執(zhí)行的一系列操作,要么完全地執(zhí)行,要么完全地不執(zhí)行。 事務(wù)處理可以確保除非事務(wù)性單元內(nèi)的所有操作都成功完成,否則不會永久更新面向數(shù)據(jù)的資源。通過將一組相關(guān)操作組合為一個要么全部成功要么全部失敗的單元,可以簡化錯誤恢復(fù)并使應(yīng)用程序更加可靠。一個邏輯工作單元要成為事務(wù),必須滿足所謂的ACID(原子性、一致性、隔離性和持久性)屬性。事務(wù)是數(shù)據(jù)庫運行中的邏輯工作單位,由DBMS中的事務(wù)管理子系統(tǒng)負(fù)責(zé)事務(wù)的處理。
ACIDatomicity 原子性
原子性:操作這些指令時,要么全部執(zhí)行成功,要么全部不執(zhí)行。只要其中一個指令執(zhí)行失敗,所有的指令都執(zhí)行失敗,數(shù)據(jù)進行回滾,回到執(zhí)行指令前的數(shù)據(jù)狀態(tài)。
consistency 一致性
一致性:事務(wù)的執(zhí)行使數(shù)據(jù)從一個狀態(tài)轉(zhuǎn)換為另一個狀態(tài),但是對于整個數(shù)據(jù)的完整性保持穩(wěn)定。
isolation 隔離性
隔離性:在該事務(wù)執(zhí)行的過程中,無論發(fā)生的任何數(shù)據(jù)的改變都應(yīng)該只存在于該事務(wù)之中,對外界不存在任何影響。只有在事務(wù)確定正確提交之后,才會顯示該事務(wù)對數(shù)據(jù)的改變。其他事務(wù)才能獲取到這些改變后的數(shù)據(jù)。
durability 持久性
持久性:當(dāng)事務(wù)正確完成后,它對于數(shù)據(jù)的改變是永久性的。
并發(fā)事務(wù)導(dǎo)致的問題在許多事務(wù)處理同一個數(shù)據(jù)時,如果沒有采取有效的隔離機制,那么并發(fā)處理數(shù)據(jù)時,會帶來一些的問題。
臟讀(Dirty Read)當(dāng)一個事務(wù)讀取另一個事務(wù)尚未提交的修改時,產(chǎn)生臟讀。
同一事務(wù)內(nèi)不是臟讀。 一個事務(wù)開始讀取了某行數(shù)據(jù),但是另外一個事務(wù)已經(jīng)更新了此數(shù)據(jù)但沒有能夠及時提交。這是相當(dāng)危險的,因為很可能所有的操作都被回滾,也就是說讀取出的數(shù)據(jù)其實是錯誤的。
非重復(fù)讀(Nonrepeatable Read)一個事務(wù)對同一行數(shù)據(jù)重復(fù)讀取兩次,但是卻得到了不同的結(jié)果。同一查詢在同一事務(wù)中多次進行,由于其他提交事務(wù)所做的修改或刪除,每次返回不同的結(jié)果集,此時發(fā)生非重復(fù)讀。
幻讀(Phantom Reads)事務(wù)在操作過程中進行兩次查詢,第二次查詢的結(jié)果包含了第一次查詢中未出現(xiàn)的數(shù)據(jù)(這里并不要求兩次查詢的SQL語句相同)。這是因為在兩次查詢過程中有另外一個事務(wù)插入數(shù)據(jù)造成的。
當(dāng)對某行執(zhí)行插入或刪除操作,而該行屬于某個事務(wù)正在讀取的行的范圍時,會發(fā)生幻像讀問題。
丟失修改(Lost Update)第一類:當(dāng)兩個事務(wù)更新相同的數(shù)據(jù)源,如果第一個事務(wù)被提交,第二個卻被撤銷,那么連同第一個事務(wù)做的更新也被撤銷。
第二類:有兩個并發(fā)事務(wù)同時讀取同一行數(shù)據(jù),然后其中一個對它進行修改提交,而另一個也進行了修改提交。這就會造成第一次寫操作失效。
事務(wù)隔離為了兼顧并發(fā)效率和異??刂疲跇?biāo)準(zhǔn)SQL規(guī)范中,定義了4個事務(wù)隔離級別.
讀未提交(Read Uncommitted)直譯就是"讀未提交",意思就是即使一個更新語句沒有提交,但是別的事務(wù)可以讀到這個改變。
Read Uncommitted允許臟讀。
讀已提交(Read Committed)直譯就是"讀提交",意思就是語句提交以后,即執(zhí)行了 Commit 以后別的事務(wù)就能讀到這個改變,只能讀取到已經(jīng)提交的數(shù)據(jù)。Oracle等多數(shù)數(shù)據(jù)庫默認(rèn)都是該級別。
Read Commited 不允許臟讀,但會出現(xiàn)非重復(fù)讀。
可重復(fù)讀(Repeatable Read):直譯就是"可以重復(fù)讀",這是說在同一個事務(wù)里面先后執(zhí)行同一個查詢語句的時候,得到的結(jié)果是一樣的。
Repeatable Read 不允許臟讀,不允許非重復(fù)讀,但是會出現(xiàn)幻象讀。
串行讀(Serializable)直譯就是"序列化",意思是說這個事務(wù)執(zhí)行的時候不允許別的事務(wù)并發(fā)執(zhí)行。完全串行化的讀,每次讀都需要獲得表級共享鎖,讀寫相互都會阻塞。
Serializable 不允許不一致現(xiàn)象的出現(xiàn)。
通過不同的隔離級別,可以防止一些并發(fā)事務(wù)問題,同時級別越高則相應(yīng)性能越低,這個設(shè)置需要根據(jù)實際場景進行設(shè)置.
下一篇:MySQL數(shù)據(jù)庫事務(wù)以及存儲引擎
系列文章:
事務(wù)Transaction
Spring Cloud 分布式事務(wù)管理
Spring Cloud 分布式事務(wù)管理(二)2pc/3pc
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/72043.html
摘要:在相關(guān)數(shù)據(jù)庫中,所有規(guī)則都必須應(yīng)用于事務(wù)的修改,以保持所有數(shù)據(jù)的完整性。隔離性一個事務(wù)的執(zhí)行不能被其他事務(wù)所影響。比如,事務(wù)在事務(wù)提交前讀到的結(jié)果,和提交后讀到的結(jié)果可能不同。 重要 由于之前代碼的不嚴(yán)謹(jǐn),導(dǎo)致結(jié)果和結(jié)論的錯誤,深表歉意,現(xiàn)在對其進行修正 摘要 事務(wù)在日常開發(fā)中是不可避免碰到的問題,JDBC中的事務(wù)隔離級別到底會如何影響事務(wù)的并發(fā),臟讀(dirty reads), 不可...
摘要:深入解析系列之并發(fā)控制與事務(wù)機制并發(fā)控制旨在針對數(shù)據(jù)庫中對事務(wù)并行的場景,保證中的一致性與隔離。啟動并執(zhí)行第一個命令。事務(wù)管理器分配,并返回事務(wù)快照,因為正在進行中。意味著該行由另一個并發(fā)事務(wù)更新,并且其事務(wù)尚未終止。 showImg(https://segmentfault.com/img/remote/1460000018081793); 深入解析 PostgreSQL 系列整理...
摘要:深入解析系列之并發(fā)控制與事務(wù)機制并發(fā)控制旨在針對數(shù)據(jù)庫中對事務(wù)并行的場景,保證中的一致性與隔離。啟動并執(zhí)行第一個命令。事務(wù)管理器分配,并返回事務(wù)快照,因為正在進行中。意味著該行由另一個并發(fā)事務(wù)更新,并且其事務(wù)尚未終止。 showImg(https://segmentfault.com/img/remote/1460000018081793); 深入解析 PostgreSQL 系列整理...
摘要:以上出自發(fā)行說明,這段指出版本支持自動查殺超過指定時間的空閑事務(wù)連接,下面演示下。修改以下參數(shù)備注參數(shù)單位為毫秒,這里設(shè)置超時空閑事務(wù)時間為秒。數(shù)據(jù)庫日志備注數(shù)據(jù)庫日志里清晰地記錄了進程的連接由于空閑事務(wù)超時被斷開連接。 熟悉 PostgreSQL 的朋友應(yīng)該知道 idle in transaction 進程,引發(fā) idle in transaction 的原因很多,例如應(yīng)用代碼中忘記...
閱讀 1585·2021-11-25 09:43
閱讀 2488·2019-08-30 15:54
閱讀 2952·2019-08-30 15:53
閱讀 1102·2019-08-30 15:53
閱讀 757·2019-08-30 15:52
閱讀 2551·2019-08-26 13:36
閱讀 822·2019-08-26 12:16
閱讀 1221·2019-08-26 12:13