監(jiān)理公司管理系統(tǒng) | 工程企業(yè)管理系統(tǒng) | OA系統(tǒng) | ERP系統(tǒng) | 造價(jià)咨詢管理系統(tǒng) | 工程設(shè)計(jì)管理系統(tǒng) | 甲方項(xiàng)目管理系統(tǒng) | 簽約案例 | 客戶案例 | 在線試用
X 關(guān)閉
鷹潭網(wǎng)站建設(shè)公司

當(dāng)前位置:工程項(xiàng)目OA系統(tǒng) > 泛普各地 > 江西OA系統(tǒng) > 鷹潭OA > 鷹潭網(wǎng)站建設(shè)公司

MySQL InnoDB之事務(wù)與鎖詳解

申請(qǐng)免費(fèi)試用、咨詢電話:400-8352-114

鷹潭網(wǎng)站建設(shè) www.diyphp.net

引題:為何引進(jìn)業(yè)務(wù)?

1>.數(shù)據(jù)完整性

2>.數(shù)據(jù)安全性

3>.充分利用體系資源,進(jìn)步體系并發(fā)處置的才能

1. 業(yè)務(wù)的特征

業(yè)務(wù)具有四個(gè)特性:原子性(Atomiocity)、共同性(Consistency)、阻隔性(Isolation)和持久性(Durability),這四個(gè)特性簡(jiǎn)稱ACID特性。

1.1原子性

業(yè)務(wù)是數(shù)據(jù)庫(kù)的邏輯工作單位,業(yè)務(wù)中包羅的一切操作要么都做,要么都不做。

1.2 共同性

業(yè)務(wù)履行的成果必須是使數(shù)據(jù)庫(kù)從一個(gè)共同性的狀況變到別的一個(gè)共同性狀況。

1.3 阻隔性

一個(gè)業(yè)務(wù)的履行不能被其他業(yè)務(wù)攪擾。即一個(gè)業(yè)務(wù)內(nèi)部的操作及運(yùn)用的數(shù)據(jù)對(duì)其他

業(yè)務(wù)是阻隔的,并發(fā)履行的各個(gè)業(yè)務(wù)之間相互不攪擾。

1.4 持久性

一個(gè)業(yè)務(wù)一旦成功提交,對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的修正就是持久性的。接下來其他的其他

操作或毛病不應(yīng)該對(duì)其履行成果有任何影響。

2. MySQL的InnoDB引擎中事物與鎖

2.1 SELECT …… LOCK IN SHARE MODE

會(huì)話業(yè)務(wù)中查找的數(shù)據(jù),加上一個(gè)同享鎖。若會(huì)話業(yè)務(wù)中查找的數(shù)據(jù)曾經(jīng)被其他會(huì)話業(yè)務(wù)加上獨(dú)占鎖的話,同享鎖會(huì)等候其完畢再加,若等候時(shí)間過長(zhǎng)就會(huì)顯現(xiàn)業(yè)務(wù)需求的鎖等候超時(shí)。

2.2 SELECT ….. FOR UPDATE

會(huì)話業(yè)務(wù)中查找的數(shù)據(jù),加上一個(gè)讀更新瑣,其他會(huì)話業(yè)務(wù)將無法再加其他鎖,必須等候其完畢。

2.3 INSERT、UPDATE、DELETE

會(huì)話業(yè)務(wù)會(huì)對(duì)DML句子操作的數(shù)據(jù)加上一個(gè)獨(dú)占鎖,其他會(huì)話的業(yè)務(wù)都將會(huì)等候其開釋獨(dú)占鎖。

2.4 gap and next key lock(空隙鎖)

InnoDB引擎會(huì)主動(dòng)給會(huì)話業(yè)務(wù)中的同享鎖、更新瑣以及獨(dú)占鎖,需求加到一個(gè)區(qū)間值域的時(shí)分,再加上個(gè)空隙鎖(或稱規(guī)模鎖),對(duì)不存在的數(shù)據(jù)也鎖住,避免呈現(xiàn)幻寫。

補(bǔ)白:

以上2.1,2.2,2.3,2.4中描繪的狀況,跟MySQL所設(shè)置的業(yè)務(wù)阻隔等級(jí)也有聯(lián)系。

3.四種業(yè)務(wù)阻隔形式

3.1 READ UNCOMMITED

SELECT的時(shí)分答應(yīng)臟讀,即SELECT會(huì)讀取其他業(yè)務(wù)修正而還沒有提交的數(shù)據(jù)。

3.2 READ COMMITED

SELECT的時(shí)分無法重復(fù)讀,即同一個(gè)業(yè)務(wù)中兩次履行相同的查詢句子,若在第一次與第二次查詢之間時(shí)間段,其他業(yè)務(wù)又剛好修正了其查詢的數(shù)據(jù)且提交了,則兩次讀到的數(shù)據(jù)不共同。

3.3 REPEATABLE READ

SELECT的時(shí)分可以重復(fù)讀,即同一個(gè)業(yè)務(wù)中兩次履行相同的查詢句子,得到的數(shù)據(jù)一直都是共同的。

3.4 SERIALIZABLE

與可重復(fù)讀的僅有區(qū)別是,默許把一般的SELECT句子改成SELECT …. LOCK IN SHARE MODE。即為查詢句子涉及到的數(shù)據(jù)加上同享瑣,堵塞其他業(yè)務(wù)修正實(shí)在數(shù)據(jù)。

4. 驗(yàn)證業(yè)務(wù)與確定示例

接下來,咱們將以MySQL中的InnoDB引擎,解說其如何完成ACID特性,異樣阻隔等級(jí)下業(yè)務(wù)與業(yè)務(wù)之間的影響。示例表布局:

CREATE TABLE `account ` (

`ID` int(11) NOT NULL AUTO_INCREMENT,

`VACCOUNT_ID` varchar(32) NOT NULL,

`GMT_CREATE` datetime NOT NULL,

PRIMARY KEY (`ID`),

KEY `idx_VACCOUNT_PARAMETER_VACCOUNTID ` (`VACCOUNT_ID`)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE utf8_general_ci;

然后向表account中寫入10W條創(chuàng)立日期散布合理的帳號(hào)數(shù)據(jù),以便利測(cè)驗(yàn)之用。

tx_isolation:SET GLOBAL tx_isolation=’read-uncommitted’ ID 業(yè)務(wù)1 業(yè)務(wù)1輸出 業(yè)務(wù)2 業(yè)務(wù)2輸出 1 START TRANSACTION;       2 SELECT VACCOUNT_ID from account  where ID =1001; caimao101510           START TRANSACTION;   3     UPDATE account set VACCOUNT_ID=’uncommitted’ where ID =1001;   4     SELECT VACCOUNT_ID from account  where ID =1001; uncommitted 5 SELECT VACCOUNT_ID from account  where ID =1001; uncommitted     6     ROLLBACK;   7 SELECT VACCOUNT_ID from account  where ID =1001; caimao101510     8 COMMIT;       tx_isolation:SET GLOBAL tx_isolation=’read-committed’ ID 業(yè)務(wù)1 業(yè)務(wù)1輸出 業(yè)務(wù)2 業(yè)務(wù)2輸出 1 START TRANSACTION;       2 SELECT VACCOUNT_ID from account  where ID =1001; caimao101510     3     START TRANSACTION;   4     UPDATE account set VACCOUNT_ID=’uncommitted’ where ID =1001;   5     SELECT VACCOUNT_ID from account  where ID =1001; uncommitted 6 SELECT VACCOUNT_ID from account  where ID =1001; caimao101510     7     COMMIT;   8 SELECT VACCOUNT_ID from account  where ID =1001; uncommitted     9 COMMIT;       tx_isolation:SET GLOBAL tx_isolation=’REPEATABLE-READ’ ID 業(yè)務(wù)1 業(yè)務(wù)1輸出 業(yè)務(wù)2 業(yè)務(wù)2輸出 1 START TRANSACTION;       2 SELECT VACCOUNT_ID from account  where ID =1001; caimao101510     3     START TRANSACTION;   4     UPDATE account set VACCOUNT_ID=’uncommitted’ where ID =1001;   5     SELECT VACCOUNT_ID from account  where ID =1001; uncommitted 6 SELECT VACCOUNT_ID from account  where ID =1001; caimao101510     7     COMMIT;   8 SELECT VACCOUNT_ID from account  where ID =1001; caimao101510     9 COMMIT;       tx_isolation:SET GLOBAL tx_isolation=’SERIALIZABLE’ ID 業(yè)務(wù)1 業(yè)務(wù)1輸出 業(yè)務(wù)2 業(yè)務(wù)2輸出 1 START TRANSACTION;       2 SELECT VACCOUNT_ID from account  where ID =1001; caimao101510     3     START TRANSACTION;   4     UPDATE account set VACCOUNT_ID=’uncommitted’ where ID =1001; STATE: Updating 5 SELECT VACCOUNT_ID from account  where ID =1001; caimao101510           業(yè)務(wù)2超時(shí)   6 COMMIT;       7 START TRANSACTION;       8 UPDATE account set VACCOUNT_ID=’uncommitted’ where ID =1001;       9     START TRANSACTION;   10     SELECT VACCOUNT_ID from account  where ID =1001; STATE:statistics 11     業(yè)務(wù)2超時(shí)   12 commit;       tx_isolation:SET GLOBAL tx_isolation=’REPEATABLE-READ’ ID 業(yè)務(wù)1 業(yè)務(wù)1輸出 業(yè)務(wù)2 業(yè)務(wù)2輸出 1 START TRANSACTION;       2 select max(ID) FROM account; 124999     3     START TRANSACTION;   4 UPDATE account set gmt_create=date_add(gmt_create,interval +1 day) WHERE ID >=124999;       5     insert into account(VACCOUNT_ID,gmt_create) values(‘eugene’,now()); STATE:update 6     業(yè)務(wù)2超時(shí)   7     START TRANSACTION;   8     SELECT * FROM account WHERE ID =124998; 2007-10-20 13:47 9     UPDATE account set gmt_create=date_add(gmt_create,interval +1 day) WHERE ID =124998; 履行成功 10     SELECT * FROM account WHERE ID =124998; 2007-10-21 13:47 11 COMMIT;       12     COMMIT;             1 START TRANSACTION;       2 UPDATE account set gmt_create=date_add(gmt_create,interval -1 day) WHERE gmt_create >’2009-07-01′;       3     START TRANSACTION;   4     SELECT * FROM account WHERE gmt_create>’2009-07-10′ LIMIT 1; 2009-10-2 13:47 5 SELECT * FROM account WHERE gmt_create>’2009-07-10′ LIMIT 1; 2009-10-1 13:47   STATE:update 6     insert into account(VACCOUNT_ID,gmt_create) values(‘gmt_create_test’,now());   7     業(yè)務(wù)2超時(shí)   8 COMMIT;       9     SELECT * FROM account WHERE gmt_create>’2009-07-10′ LIMIT 1; 2009-10-1 13:47 無索引條件更新業(yè)務(wù) 1 START TRANSACTION;         UPDATE account set gmt_create=date_add(gmt_create,interval -1 day) WHERE gmt_create >’2009-07-01′ AND gmt_create <’2009-07-10′;             START TRANSACTION;         insert into account(VACCOUNT_ID,gmt_create) values(‘gmt_create_interval’,now());         業(yè)務(wù)2超時(shí)     COMMIT;      

 

發(fā)布:2007-03-31 14:58    編輯:泛普軟件 · xiaona    [打印此頁(yè)]    [關(guān)閉]
相關(guān)文章:
鷹潭OA
聯(lián)系方式

成都公司:成都市成華區(qū)建設(shè)南路160號(hào)1層9號(hào)

重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓

咨詢:400-8352-114

加微信,免費(fèi)獲取試用系統(tǒng)

QQ在線咨詢

泛普鷹潭網(wǎng)站建設(shè)公司其他應(yīng)用

鷹潭軟件開發(fā)公司 鷹潭門禁系統(tǒng) 鷹潭物業(yè)管理軟件 鷹潭倉(cāng)庫(kù)管理軟件 鷹潭餐飲管理軟件 鷹潭網(wǎng)站建設(shè)公司