事务的隔离 transaction isolation

总共有4钟transaction isolation. Serializable level的transaction,并发运行和挨个执行的结果是一样的。并发的transaction会产生缺陷(phenomena)。Serialization level 的transaction不会有这些缺陷(phenomena)。

 

在不同transaction levels 中被消灭的缺陷(phenomena)

sex

name

male

李雷

female

韩梅梅

Dirty read: 多条并发transaction中,一个transaction中的sql读取了另一个transaction未提交(committed)的数据。

脏读:

transaction1

transaction2

Begin:

Begin:

Select * from user where sex=’male’;

查出:李雷

 

 

Insert into user (‘Jack’,  ‘male’)

Select * from user where sex=’male’;

查出:李雷和 Jack

 

 

commit

Nonrepeatable read: 在一个transaction中,一条数据被先后读了两次。由于这中间另外一个transaction修改了这条数据,并提交了,导致第二次读出来的数据和第一次不一样。

transaction1

transaction2

Begin:

Begin:

Select * from user where sex=’male’;

查出:李雷

 

 

Insert into user (‘Jack’,  ‘male’)

 

commit

Select * from user where sex=’male’;

查出:李雷和 Jack

 

 

 

Phantom read: 在一个transaction中,一条查询sql执行了两次。由于中间有另一个transaction提交了数据,导致两次查出来的数据集不同。

transaction1

transaction2

Begin:

Begin:

Select * from user where sex=’male’;

查出:李雷

 

 

Insert into user (‘Jack’,  ‘male’)

 

commit

Select * from user where sex=’male’;

查出:李雷和 Jack

 

 

 

Serialization anomaly:多个transaction并发执行的结果和挨个执行的结果不同。

transaction1

transaction2

Begin:

Begin:

Select * from user where sex=’male’;

查出:李雷

 

 

Insert into user (‘Jack’,  ‘male’)

 

commit

Insert into user (‘MR李雷,  ‘male’)

必须要有这条插入语句,因为只读事务不会混滚

 

Commit;

提交的时候会回滚,因为查询语句在事务的中途失效了。

 

 

 

不同的事务隔离级别对应解决的问题

Isolation level

Dirty read

Nonrepeatable read

Read phantom

Serialization anomaly

Read uncommitted

×(only in PostgreSQL)

 

 

 

Read committed

×

 

 

 

Repeatable read

×

×

×(only in PostgreSQL)

 

serialization

×

×

×

×

提醒

Sequence的变化会立即同步给并发的transaction,并且不会因为某一个transaction回滚而回滚squence。同理还有serial。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值