mysql串行化隔离级别:
建表如下:
createtable a (a int, b int, c int);
create index idx on a(a,b,c);
setsession transaction isolation level serializable; //设置本session的事务隔离级别
begin;
select * froma where a>3 and a<8;
commit;
在串行化隔离级别中的查询语句将锁住整个表,其他事务对于表的操作将被阻塞。(有无索引都将阻塞)
oracle串行化隔离级别:
建表如下:
createtable a (a int, b int, c int);
create index idx on a(a,b,c);
//!因为oracle默认是非自动提交的,不需要手动开始事务
settransaction isolation level serializable; //!设置本事务未串行化隔离级别
select* from a where a>3 and a<8;
commit;
与read committed不同的是在串行化隔离级别事务中的查询看不到其他事务提交的更改。
而read committed可以看到其他事务提交的更改。
同时串行化隔离级别中的查询不阻塞其他事务对于同一个表的更改。
猜测是read commited级别中的查询每次开启查询时都是获取当前的snapshot,而serialzable中的查询则是每次查询都是事务开始时的snapshot。
postgresql串行化隔离级别:
pg的实现与oracle类似
create table a (a int, b int, c int);
create index idx on a(a, b ,c);
begin isolation level serializable;
select * from a where a>3 and a<8;
commit;
串行化隔离级别下不造成任何阻塞,只是看到的结果会与read committed中的有所不同。