亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 10932 | 回復(fù): 10
打印 上一主題 下一主題

PostgreSQL與MySQL事務(wù)隔離級(jí)別的不同 [復(fù)制鏈接]

論壇徽章:
3
數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2015-06-18 22:20:00數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2015-06-21 22:20:00數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2015-08-27 06:20:00
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2013-03-15 21:17 |只看該作者 |倒序?yàn)g覽
數(shù)據(jù)庫的事務(wù)隔離級(jí)別有4種:

    READ UNCOMMITTED
    READ COMMITTED
    REPEATABLE READ
    SERIALIZABLE

而在PostgreSQL事務(wù)隔離級(jí)別中,READ UNCOMMITTED是之間被認(rèn)為是READ COMMITTED,所以實(shí)際上只有三種。
PostgreSQL默認(rèn)隔離級(jí)別是READ COMMTIED,而MySQL默認(rèn)為REPEATABLE READ,另MySQL是有READ UNCOMMITTED這種級(jí)別的,不過一般這種事務(wù)隔離級(jí)別基本上沒有什么用。

MySQL 在REPEATABLE READ隔離級(jí)別下,普通的select語句是看不到在事務(wù)啟動(dòng)之后已經(jīng)提交的數(shù)據(jù),但select for update卻能看到,也就是說普通select與select for update看到的結(jié)果是不一樣的,這是特別需要讓開發(fā)人員注意的地方。
而PostgreSQL在REPEATABLE READ隔離級(jí)別,select for udpate語句和select語句的結(jié)果是一樣的,都看不到在事務(wù)啟動(dòng)之后已經(jīng)提交的數(shù)據(jù)。


另MySQL有一個(gè)很奇怪的間隙鎖,如果表中的數(shù)據(jù)為(1,2,3,10,11),如果執(zhí)行select * from t1 where id=6 for update;加鎖后,其它的用戶將不能插入(4,5,6,7,8,9)的主鍵值了;如果select for update鎖住一個(gè)主鍵值比表中現(xiàn)有主鍵值還大的一個(gè)值時(shí),則此表就不能插入比表中主鍵值更大的鍵值了。

下面演示一下:
在PostgreSQL中建測(cè)試表和數(shù)據(jù):
osdba=# create table t1(id int primary key, info text);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "t1_pkey" for table "t1"
CREATE TABLE
osdba=# insert into t1 values(1,'11111');
INSERT 0 1
osdba=# insert into t1 values(2,'22222');
INSERT 0 1
osdba=# insert into t1 values(3,'33333');
INSERT 0 1
osdba=# insert into t1 values(10,'101010');
INSERT 0 1
osdba=# insert into t1 values(11,'111111');

osdba=# select * from t1;
id |  info
----+--------
  1 | 11111
  2 | 22222
  3 | 33333
10 | 101010
11 | 111111
(5 rows)

在MySQL中建測(cè)試數(shù)據(jù):
mysql> create table t1(id int primary key, info varchar(255));
Query OK, 0 rows affected (0.13 sec)


mysql> insert into t1 values(1,'11111');
Query OK, 1 row affected (0.03 sec)

mysql> insert into t1 values(2,'22222');
Query OK, 1 row affected (0.04 sec)

mysql> insert into t1 values(3,'33333');
Query OK, 1 row affected (0.05 sec)

mysql> insert into t1 values(10,'101010');
Query OK, 1 row affected (0.04 sec)

mysql> select * from t1;
+----+--------+
| id | info   |
+----+--------+
|  1 | 11111  |
|  2 | 22222  |
|  3 | 33333  |
| 10 | 101010 |
| 11 | 111111 |
+----+--------+
5 rows in set (0.00 sec)


先測(cè)試PostgreSQL:
在窗口1中,在“REPEATABLE READ”啟動(dòng)一個(gè)事務(wù):

osdba=# begin isolation level REPEATABLE READ ;
BEGIN

在窗口2中,往表插入一條記錄:
osdba=# insert into t1 values(5,'555555');
INSERT 0 1

然后再回到窗口1中:
osdba=# select * from t1 where id=5;
id | info
----+------
(0 rows)

osdba=# select * from t1 where id=5 for update;
id | info
----+------
(0 rows)

可以看到在PostgreSQL中不管是select語句不管加不加for update,看到的結(jié)果都是一樣的,都看不到id=5記錄。


而MySQL是不一樣的,MySQL的普通select 語句是看不到id=5的記錄,但select for update卻能看到,見下面:

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t1 where id=5;
Empty set (0.00 sec)

mysql> select * from t1 where id=5 for update;
+----+-------+
| id | info  |
+----+-------+
|  5 | 55555 |
+----+-------+
1 row in set (0.00 sec)

mysql>

可以看到MySQL在REPEATABLE READ隔的級(jí)別下,看到的select for update與普通的select 看到的結(jié)果是不一樣的。


在MySQL中,一旦設(shè)置了SERIALIZABLE級(jí)別后,在事務(wù)中一旦查詢表,就會(huì)把查詢的記錄都鎖住,而PostgreSQL中的SERIALIZABLE也與MySQL中完全不一樣。查詢不會(huì)鎖表。
在PostgreSQL中,在窗口1中先開始一個(gè)事務(wù),然后在窗口2中再開始一個(gè)事務(wù),窗口2中修改id=3的記錄,再到窗口1中修改id=3的記錄時(shí),會(huì)報(bào)錯(cuò),由此實(shí)現(xiàn)了SERIALIZABLE的隔離級(jí)別。
由此可見在SERIALIZABLE的級(jí)別上,PostGreSQL的并發(fā)會(huì)比MySQL好很多。

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2013-03-19 15:36 |只看該作者
pg是真正做到了SERIALIZABLE的級(jí)別,可惜這個(gè)級(jí)別使用的場合太少了

論壇徽章:
1
寅虎
日期:2013-09-29 23:15:15
3 [報(bào)告]
發(fā)表于 2013-05-12 11:44 |只看該作者
回復(fù) 2# pix77


    請(qǐng)教, 那這個(gè)應(yīng)該在什么場合上使用?

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2013-05-13 09:50 |只看該作者
回復(fù) 3# congli
以前在看pg文檔時(shí),確實(shí)有:
http://www.postgresql.org/commun ... e-transaction-mode/
具體還是看應(yīng)用,不過,我不用

   

論壇徽章:
1
寅虎
日期:2013-09-29 23:15:15
5 [報(bào)告]
發(fā)表于 2013-05-13 14:12 |只看該作者
回復(fù) 4# pix77


   在自己開發(fā)的系統(tǒng)上,用SERIALIZABLE,感覺邏輯要簡單點(diǎn).

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2013-05-13 15:49 |只看該作者
回復(fù) 5# congli


    呵呵,都是一條線了,排隊(duì)來

論壇徽章:
1
寅虎
日期:2013-09-29 23:15:15
7 [報(bào)告]
發(fā)表于 2013-05-14 10:33 |只看該作者
回復(fù) 6# pix77


   看資料,PG內(nèi)部也只有兩種級(jí)別讀已提交(Read committed), 可串行化(Serializable),
小系統(tǒng)還是用Serializable來得簡單.

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2013-05-14 11:07 |只看該作者
回復(fù) 7# congli


    呵呵,電商要是用可串行化,要崩潰了,
    要專門的應(yīng)用需要才有用

論壇徽章:
1
寅虎
日期:2013-09-29 23:15:15
9 [報(bào)告]
發(fā)表于 2013-05-14 11:14 |只看該作者
回復(fù) 8# pix77


    呵~所以說是小系統(tǒng)嘛.
畢竟讀已提交(Read committed),在一個(gè)事務(wù)里面需要考慮到其他已提交的事務(wù), 情況就復(fù)雜多了.

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2013-05-14 11:27 |只看該作者
回復(fù) 9# congli


    嗯,總是有用武之地
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP