oracle怎么解決幻讀 數(shù)據(jù)庫幻讀怎么解決

oracle默認(rèn)事務(wù)級別可導(dǎo)致重復(fù)讀嗎

事務(wù)的隔離級別

成都創(chuàng)新互聯(lián)公司專注于定結(jié)網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供定結(jié)營銷型網(wǎng)站建設(shè),定結(jié)網(wǎng)站制作、定結(jié)網(wǎng)頁設(shè)計(jì)、定結(jié)網(wǎng)站官網(wǎng)定制、微信小程序開發(fā)服務(wù),打造定結(jié)網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供定結(jié)網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

數(shù)據(jù)庫事務(wù)的隔離級別有4個(gè),由低到高依次為Read uncommitted、Read committed、Repeatable read、Serializable,這四個(gè)級別可以逐個(gè)解決臟讀、不可重復(fù)讀、幻讀這幾類問題。

√: 可能出現(xiàn) ×: 不會出現(xiàn)

臟讀不可重復(fù)讀幻讀

Read uncommitted√√√

Read committed×√√

Repeatable read××√

Serializable×××

注意:我們討論隔離級別的場景,主要是在多個(gè)事務(wù)并發(fā)的情況下,因此,接下來的講解都圍繞事務(wù)并發(fā)。

Read uncommitted 讀未提交

公司發(fā)工資了,領(lǐng)導(dǎo)把5000元打到singo的賬號上,但是該事務(wù)并未提交,而 singo正好去查看賬戶,發(fā)現(xiàn)工資已經(jīng)到賬,是5000元整,非常高興??墒遣恍业氖?,領(lǐng)導(dǎo)發(fā)現(xiàn)發(fā)給singo的工資金額不對,是2000元,于是迅速 回滾了事務(wù),修改金額后,將事務(wù)提交,最后singo實(shí)際的工資只有2000元,singo空歡喜一場。

出現(xiàn)上述情況,即我們所說的臟讀,兩個(gè)并發(fā)的事務(wù),“事務(wù)A:領(lǐng)導(dǎo)給singo發(fā)工資”、“事務(wù)B:singo查詢工資賬戶”,事務(wù)B讀取了事務(wù)A尚未提交的數(shù)據(jù)。

當(dāng)隔離級別設(shè)置為Read uncommitted時(shí),就可能出現(xiàn)臟讀,如何避免臟讀,請看下一個(gè)隔離級別。

Read committed 讀提交

singo拿著工資卡去消費(fèi),系統(tǒng)讀取到卡里確實(shí)有2000元,而此時(shí)她的老婆也正好 在網(wǎng)上轉(zhuǎn)賬,把singo工資卡的2000元轉(zhuǎn)到另一賬戶,并在singo之前提交了事務(wù),當(dāng)singo扣款時(shí),系統(tǒng)檢查到singo的工資卡已經(jīng)沒有 錢,扣款失敗,singo十分納悶,明明卡里有錢,為何......

出現(xiàn)上述情況,即我們所說的不可重復(fù)讀,兩個(gè)并發(fā)的事務(wù),“事務(wù)A:singo消費(fèi)”、“事務(wù)B:singo的老婆網(wǎng)上轉(zhuǎn)賬”,事務(wù)A事先讀取了數(shù)據(jù),事務(wù)B緊接了更新了數(shù)據(jù),并提交了事務(wù),而事務(wù)A再次讀取該數(shù)據(jù)時(shí),數(shù)據(jù)已經(jīng)發(fā)生了改變。

當(dāng)隔離級別設(shè)置為Read committed時(shí),避免了臟讀,但是可能會造成不可重復(fù)讀。

大多數(shù)數(shù)據(jù)庫的默認(rèn)級別就是Read committed,比如Sql Server , Oracle。如何解決不可重復(fù)讀這一問題,請看下一個(gè)隔離級別。

Repeatable read 重復(fù)讀

當(dāng)隔離級別設(shè)置為Repeatable read時(shí),可以避免不可重復(fù)讀。當(dāng)singo拿著工資卡去消費(fèi)時(shí),一旦系統(tǒng)開始讀取工資卡信息(即事務(wù)開始),singo的老婆就不可能對該記錄進(jìn)行修改,也就是singo的老婆不能在此時(shí)轉(zhuǎn)賬。

雖然Repeatable read避免了不可重復(fù)讀,但還有可能出現(xiàn)幻讀。

singo的老婆工作在銀行部門,她時(shí)常通過銀行內(nèi)部系統(tǒng)查看singo的信用卡消費(fèi) 記錄。有一天,她正在查詢到singo當(dāng)月信用卡的總消費(fèi)金額(select sum(amount) from transaction where month = 本月)為80元,而singo此時(shí)正好在外面胡吃海塞后在收銀臺買單,消費(fèi)1000元,即新增了一條1000元的消費(fèi)記錄(insert transaction ... ),并提交了事務(wù),隨后singo的老婆將singo當(dāng)月信用卡消費(fèi)的明細(xì)打印到A4紙上,卻發(fā)現(xiàn)消費(fèi)總額為1080元,singo的老婆很詫異,以為出 現(xiàn)了幻覺,幻讀就這樣產(chǎn)生了。

注:Mysql的默認(rèn)隔離級別就是Repeatable read。

Serializable 序列化

Serializable是最高的事務(wù)隔離級別,同時(shí)代價(jià)也花費(fèi)最高,性能很低,一般很少使用,在該級別下,事務(wù)順序執(zhí)行,不僅可以避免臟讀、不可重復(fù)讀,還避免了幻像讀。

怎么避免多個(gè)用戶對同一條數(shù)據(jù)做修改 我用的是C#語言和oracle數(shù)據(jù)庫,分?jǐn)?shù)沒多少希望高手幫忙解決。謝謝了

首選你需要了解一下 數(shù)據(jù)臟讀,幻讀,等一些概念,其次是你要了解一下鎖這個(gè)概念,當(dāng)一條數(shù)據(jù)被讀取時(shí),處于鎖狀態(tài),其他的用戶無法對其進(jìn)行操作。

1.3 REPEATABLE READ(可重復(fù)讀)

1.設(shè)置為可重復(fù)讀

SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;

2.首先TB做出一次查詢,此時(shí)name為bb

3.TA對數(shù)據(jù)進(jìn)行修改,并提交

4.此時(shí)加入session C作為對比,使用自動事務(wù)并做出查詢,可見數(shù)據(jù)已經(jīng)被修改

5.在已經(jīng)開啟事務(wù)的TB中,查詢到的,仍然是數(shù)據(jù)開啟事務(wù)之前的狀態(tài),所以數(shù)據(jù)是可重復(fù)讀的

可重復(fù)讀隔離級別中,每當(dāng)事務(wù)開始后,第一次執(zhí)行sql語句時(shí)(或者執(zhí)行START TRANSACTION WITH CONSISTENT SNAPSHOT)MVCC會建立一個(gè)read view,選取當(dāng)時(shí)的系統(tǒng)版本號,作為事務(wù)版本號,以Undo log的行系統(tǒng)版本號與事務(wù)版本號進(jìn)行對比,增刪改查都要遵循如下模式:

SELECT:

1, InnoDB只查找版本早于當(dāng)前事務(wù)版本的數(shù)據(jù)行(行的系統(tǒng)版本號小于等于事務(wù)版本號),這樣可以確保事務(wù)讀取的行,要么是事務(wù)開始前就存在的,要么是事務(wù)自身插入的或修改過的。

2, 行的刪除號要么未定義,要么大于當(dāng)前事務(wù)版本號,這樣可以確保事務(wù)讀取到的行,在事務(wù)開始之前未被刪除。

INSERT:

InnoDB 為新插入的每一行保存當(dāng)前系統(tǒng)版本號做為行版本號。

DELETE:

INNODB 為刪除的每一行保存當(dāng)前系統(tǒng)版本號作為行刪除標(biāo)識。

UPDATE:

InnoDB 為插入的每一行新記錄,保存當(dāng)前系統(tǒng)版本號作為行版本號,同時(shí)保存當(dāng)前系統(tǒng)版本號到原來的行作為行刪除標(biāo)識。

所以READ COMMITTED和REPEATABLE READ的區(qū)別在于,READ COMMITTED總是讀取被鎖定行的最新一份快照數(shù)據(jù), 所以會有不可重復(fù)讀的問題。而REPEATABLE READ讀取事務(wù)開始時(shí)行系統(tǒng)版本號小于事務(wù)版本號的數(shù)據(jù),解決不可重復(fù)讀的問題。

此外要提的一點(diǎn)是,MySql的REPEATABLE READ與Oracle的不同,不但解決了不可重復(fù)讀問題,還解決的“幻讀”問題。

幻讀的產(chǎn)生:遵循上述增刪改查模式,假設(shè)TA事務(wù)的事物版本號為3,TB早于TA開啟事務(wù),TB事物版本號為2,TB先新增一條數(shù)據(jù),行數(shù)據(jù)的版本號為2,并提交。TB提交后,TA查詢時(shí),滿足“行的系統(tǒng)版本號小于等于事務(wù)版本號”的條件,可以查到數(shù)據(jù),形成“幻讀”。

InnoDB采用Next-key Lock(間隙鎖)來避免“幻讀”問題。

Record Lock:單個(gè)行記錄的鎖,鎖定的是索引而非記錄本身。

GAP Lock:間隙鎖,鎖定一個(gè)范圍,但不包含記錄本身。

Next-Key Lock:Gap Lock+Record Lock 鎖定一個(gè)范圍并鎖定記錄本身。

舉例說明:

某表字段為ID和NAME,有3條睡覺,ID分別為10,20,50。

如果索引為 10,20,50,那么:

Record Lock:select * from tab where id = 10 for update; //對id=10單行進(jìn)行加鎖

Gap Lock鎖范圍:(-∞,10)(10,20)(20,50)(50,+∞)

Next-Key Lock鎖范圍:(-∞,10] (10,20] (20,50] (50,+∞)

當(dāng)查詢的索引含有唯一屬性時(shí),InnoDB會對Next-Key Lock進(jìn)行優(yōu)化,將其降級為Record Lock,即僅鎖住索引本身,而不是范圍。

雖然避免了幻讀問題,但是還有個(gè)特殊情況,感覺可以叫做“幻改”,即當(dāng)前事務(wù)修改了本身并不能查詢到的數(shù)據(jù)。這也是MVCC造成的假象,當(dāng)前事務(wù)雖然查詢不到其他事務(wù)提交的數(shù)據(jù),但是可以對其他事務(wù)提交的數(shù)據(jù)進(jìn)行修改。

MySQL 事務(wù)的默認(rèn)隔離級別是什么?可以解決幻讀問題么?

我們設(shè)想一個(gè)場景,這個(gè)場景中我們需要插入多條相關(guān)聯(lián)的數(shù)據(jù)到數(shù)據(jù)庫,不幸的是,這個(gè)過程可能會遇到下面這些問題:

上面的任何一個(gè)問題都可能會導(dǎo)致數(shù)據(jù)的不一致性。為了保證數(shù)據(jù)的一致性,系統(tǒng)必須能夠處理這些問題。事務(wù)就是我們抽象出來簡化這些問題的首選機(jī)制。事務(wù)的概念起源于數(shù)據(jù)庫,目前,已經(jīng)成為一個(gè)比較廣泛的概念。

何為事務(wù)? 一言蔽之, 事務(wù)是邏輯上的一組操作,要么都執(zhí)行,要么都不執(zhí)行。

事務(wù)最經(jīng)典也經(jīng)常被拿出來說例子就是轉(zhuǎn)賬了。假如小明要給小紅轉(zhuǎn)賬 1000 元,這個(gè)轉(zhuǎn)賬會涉及到兩個(gè)關(guān)鍵操作,這兩個(gè)操作必須都成功或者都失敗。

事務(wù)會把這兩個(gè)操作就可以看成邏輯上的一個(gè)整體,這個(gè)整體包含的操作要么都成功,要么都要失敗。這樣就不會出現(xiàn)小明余額減少而小紅的余額卻并沒有增加的情況。

大多數(shù)情況下,我們在談?wù)撌聞?wù)的時(shí)候,如果沒有特指 分布式事務(wù) ,往往指的就是 數(shù)據(jù)庫事務(wù) 。

數(shù)據(jù)庫事務(wù)在我們?nèi)粘i_發(fā)中接觸的最多了。如果你的項(xiàng)目屬于單體架構(gòu)的話,你接觸到的往往就是數(shù)據(jù)庫事務(wù)了。

那數(shù)據(jù)庫事務(wù)有什么作用呢?

簡單來說,數(shù)據(jù)庫事務(wù)可以保證多個(gè)對數(shù)據(jù)庫的操作(也就是 SQL 語句)構(gòu)成一個(gè)邏輯上的整體。構(gòu)成這個(gè)邏輯上的整體的這些數(shù)據(jù)庫操作遵循: 要么全部執(zhí)行成功,要么全部不執(zhí)行 。

另外,關(guān)系型數(shù)據(jù)庫(例如: MySQL 、 SQL Server 、 Oracle 等)事務(wù)都有 ACID 特性:

ACID

這里要額外補(bǔ)充一點(diǎn): 只有保證了事務(wù)的持久性、原子性、隔離性之后,一致性才能得到保障。也就是說 A、I、D 是手段,C 是目的!

在典型的應(yīng)用程序中,多個(gè)事務(wù)并發(fā)運(yùn)行,經(jīng)常會操作相同的數(shù)據(jù)來完成各自的任務(wù)(多個(gè)用戶對同一數(shù)據(jù)進(jìn)行操作)。并發(fā)雖然是必須的,但可能會導(dǎo)致以下的問題。

不可重復(fù)讀和幻讀區(qū)別 :不可重復(fù)讀的重點(diǎn)是修改比如多次讀取一條記錄發(fā)現(xiàn)其中某些列的值被修改,幻讀的重點(diǎn)在于新增或者刪除比如多次查詢同一條查詢語句(DQL)時(shí),記錄發(fā)現(xiàn)記錄增多或減少了。

SQL 標(biāo)準(zhǔn)定義了四個(gè)隔離級別:

隔離級別臟讀不可重復(fù)讀幻讀 READ-UNCOMMITTED READ-COMMITTED REPEATABLE-READ SERIALIZABLE

MySQL 的隔離級別基于鎖和 MVCC 機(jī)制共同實(shí)現(xiàn)的。

SERIALIZABLE 隔離級別,是通過鎖來實(shí)現(xiàn)的。除了 SERIALIZABLE 隔離級別,其他的隔離級別都是基于 MVCC 實(shí)現(xiàn)。

不過, SERIALIZABLE 之外的其他隔離級別可能也需要用到鎖機(jī)制,就比如 REPEATABLE-READ 在當(dāng)前讀情況下需要使用加鎖讀來保證不會出現(xiàn)幻讀。

MySQL InnoDB 存儲引擎的默認(rèn)支持的隔離級別是 REPEATABLE-READ(可重讀) 。我們可以通過 SELECT @@tx_isolation; 命令來查看,MySQL 8.0 該命令改為 SELECT @@transaction_isolation;

從上面對 SQL 標(biāo)準(zhǔn)定義了四個(gè)隔離級別的介紹可以看出,標(biāo)準(zhǔn)的 SQL 隔離級別定義里,REPEATABLE-READ(可重復(fù)讀)是不可以防止幻讀的。

但是!InnoDB 實(shí)現(xiàn)的 REPEATABLE-READ 隔離級別其實(shí)是可以解決幻讀問題發(fā)生的,主要有下面兩種情況:

因?yàn)楦綦x級別越低,事務(wù)請求的鎖越少,所以大部分?jǐn)?shù)據(jù)庫系統(tǒng)的隔離級別都是 READ-COMMITTED ,但是你要知道的是 InnoDB 存儲引擎默認(rèn)使用 REPEATABLE-READ 并不會有任何性能損失。

InnoDB 存儲引擎在分布式事務(wù)的情況下一般會用到 SERIALIZABLE 隔離級別。

平時(shí)使用oracle時(shí),為什么會鎖表

數(shù)據(jù)庫事務(wù)及隔離級別

隔離級別:臟讀、幻讀、一致讀、不可重復(fù)讀、更新丟失

1.臟讀(Dirty Reads):一個(gè)事務(wù)開始讀取了某行數(shù)據(jù)但是另外一個(gè)事務(wù)已經(jīng)更新了此數(shù)據(jù)但沒有能夠及時(shí)提交。這是相當(dāng)危險(xiǎn)很可能所有操作都被回滾

2.幻讀(Phantom Reads):也稱為幻像(幻影)。事務(wù)在操作過程中進(jìn)行兩次查詢,第二次查詢結(jié)果包含了第一次查詢中未出現(xiàn)的數(shù)據(jù)(這里并不要求兩次查詢SQL語句相同)這是因?yàn)樵趦纱尾樵冞^程中有另外一個(gè)事務(wù)插入數(shù)據(jù)造成的

3.不可重復(fù)讀(Non-repeatable Reads):一個(gè)事務(wù)對同一行數(shù)據(jù)重復(fù)讀取兩次但是卻得到了不同結(jié)果。例如在兩次讀取中途有另外一個(gè)事務(wù)對該行數(shù)據(jù)進(jìn)行了修改并提交

4.兩次更新問題(Second lost updates problem):無法重復(fù)讀取特例,有兩個(gè)并發(fā)事務(wù)同時(shí)讀取同一行數(shù)據(jù)然后其中一個(gè)對它進(jìn)行修改提交而另一個(gè)也進(jìn)行了修改提交這就會造成第一次寫操作失效

5.更新丟失(Lost update):兩個(gè)事務(wù)都同時(shí)更新一行數(shù)據(jù)但是第二個(gè)事務(wù)卻中途失敗退出導(dǎo)致對數(shù)據(jù)兩個(gè)修改都失效了這是系統(tǒng)沒有執(zhí)行任何鎖操作因此并發(fā)事務(wù)并沒有被隔離開

20、鎖是什么?

鎖:在所有的DBMS(數(shù)據(jù)庫管理系統(tǒng))中,鎖是實(shí)現(xiàn)事務(wù)的關(guān)鍵,鎖可以保證事務(wù)的完整性和并發(fā)性。與現(xiàn)實(shí)生活中鎖一樣,它可以使某些數(shù)據(jù)的擁有者,在某段時(shí)間內(nèi)不能使用某些數(shù)據(jù)或數(shù)據(jù)結(jié)構(gòu)。當(dāng)然鎖還分級別的。

鎖分為行級鎖和表鎖。

行級鎖:主要是在執(zhí)行操作過程中,鎖定指定的行。

主要的鎖行語句有:insert ,update,delete ,及select ....for update。

表鎖:指在運(yùn)行操作指令過程中,由用戶指定鎖定某張表。lock table XXX in mode share;

共享鎖,排他鎖,共享排它,行共享,行排他。

鎖模式包括?

共享鎖:(讀?。┎僮鲃?chuàng)建的鎖。其他用戶可以并發(fā)讀取數(shù)據(jù),但任何事物都不能獲取數(shù)據(jù)上的排它鎖,直到已釋放所有共享鎖。

排他鎖(X鎖):對數(shù)據(jù)A加上排他鎖后,則其他事務(wù)不能再對A加任任何類型的封鎖。獲準(zhǔn)排他鎖的事務(wù)既能讀數(shù)據(jù),又能修改數(shù)據(jù)。

更新鎖:更新 (U) 鎖可以防止通常形式的死鎖。如果兩個(gè)事務(wù)獲得了資源上的共享模式鎖,然后試圖同時(shí)更新數(shù)據(jù),則兩個(gè)事務(wù)需都要轉(zhuǎn)換共享鎖為排它 (X) 鎖,并且每個(gè)事務(wù)都等待另一個(gè)事務(wù)釋放共享模式鎖,因此發(fā)生死鎖。

若要避免這種潛 在的死鎖問題,請使用更新 (U) 鎖。一次只有一個(gè)事務(wù)可以獲得資源的更新 (U) 鎖。如果事務(wù)修改資源,則更新 (U) 鎖轉(zhuǎn)換為排它 (X) 鎖。否則,鎖轉(zhuǎn)換為共享鎖。

鎖的粒度主要有以下幾種類型:

行鎖: 粒度最小,并發(fā)性最高

頁鎖:一次鎖定一頁。25個(gè)行鎖可升級為一個(gè)頁鎖。

表鎖:粒度大,并發(fā)性低

數(shù)據(jù)庫鎖:控制整個(gè)數(shù)據(jù)庫操作

樂觀鎖:樂觀鎖假設(shè)認(rèn)為數(shù)據(jù)一般情況下不會造成沖突,所以在數(shù)據(jù)進(jìn)行提交更新的時(shí)候,才會正式對數(shù)據(jù)的沖突與否進(jìn)行檢測,如果發(fā)現(xiàn)沖突了,則讓返回用戶錯(cuò)誤的信息,讓用戶決定如何去做。一般的實(shí)現(xiàn)樂觀鎖的方式就是記錄數(shù)據(jù)版本。

悲觀鎖:每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人會修改,所以每次在拿數(shù)據(jù)的時(shí)候都會上鎖,這樣別人想拿這個(gè)數(shù)據(jù)就會block直到它拿到鎖。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫里邊就用到了很多這種鎖機(jī)制,比如行鎖,表鎖,讀鎖,寫鎖等,都是在做操作之前先上鎖。

20、數(shù)據(jù)庫的樂觀鎖和悲觀鎖是什么? oracle 是行級鎖

數(shù)據(jù)庫管理系統(tǒng)(DBMS)中,并發(fā)控制的任務(wù)是:確保在多個(gè)事務(wù)同時(shí)存取同一數(shù)據(jù)時(shí),不破壞事務(wù)的隔離性和統(tǒng)一性以及數(shù)據(jù)庫的統(tǒng)一性。

悲觀鎖:假定會發(fā)生并發(fā)沖突,屏蔽一切可能違反數(shù)據(jù)完整性的操作

樂觀鎖:假設(shè)不會發(fā)生并發(fā)沖突,只在提交操作時(shí)檢查是否違反數(shù)據(jù)完整性。

21、悲觀鎖和樂觀鎖的區(qū)別,怎么實(shí)現(xiàn)

悲觀鎖:一段執(zhí)行邏輯加上悲觀鎖,不同線程同時(shí)執(zhí)行時(shí),只能有一個(gè)線程執(zhí)行,其他的線程在入口處等待,直到鎖被釋放。

樂觀鎖:一段執(zhí)行邏輯加上樂觀鎖,不同線程同時(shí)執(zhí)行時(shí),可以同時(shí)進(jìn)入執(zhí)行,在最后更新數(shù)據(jù)的時(shí)候要檢查這些數(shù)據(jù)是否被其他線程修改了(版本和執(zhí)行初是否相同),沒有修改則進(jìn)行更新,否則放棄本次操作。

什么是oracle數(shù)據(jù)庫隔離級別

1.查看當(dāng)前會話隔離級別

select @@tx_isolation;

2.查看系統(tǒng)當(dāng)前隔離級別

select @@global.tx_isolation;

3.設(shè)置當(dāng)前會話隔離級別

set session transaction isolatin level repeatable read;

4.設(shè)置系統(tǒng)當(dāng)前隔離級別

set global transaction isolation level repeatable read;

5.命令行,開始事務(wù)時(shí)

set autocommit=off 或者 start transaction

關(guān)于隔離級別的理解

1.read uncommitted

可以看到未提交的數(shù)據(jù)(臟讀),舉個(gè)例子:別人說的話你都相信了,但是可能他只是說說,并不實(shí)際做。

2.read committed

讀取提交的數(shù)據(jù)。但是,可能多次讀取的數(shù)據(jù)結(jié)果不一致(不可重復(fù)讀,幻讀)。用讀寫的觀點(diǎn)就是:讀取的行數(shù)據(jù),可以寫。

3.repeatable read(MySQL默認(rèn)隔離級別)

可以重復(fù)讀取,但有幻讀。讀寫觀點(diǎn):讀取的數(shù)據(jù)行不可寫,但是可以往表中新增數(shù)據(jù)。在MySQL中,其他事務(wù)新增的數(shù)據(jù),看不到,不會產(chǎn)生幻讀。采用多版本并發(fā)控制(MVCC)機(jī)制解決幻讀問題。

4.serializable

可讀,不可寫。像java中的鎖,寫數(shù)據(jù)必須等待另一個(gè)事務(wù)結(jié)束。

分享題目:oracle怎么解決幻讀 數(shù)據(jù)庫幻讀怎么解決
文章位置:http://muchs.cn/article38/hjsipp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、商城網(wǎng)站、微信公眾號網(wǎng)站導(dǎo)航、搜索引擎優(yōu)化營銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計(jì)公司