postgresql 事务_Go示例的PostgreSQL事务隔离级别

postgresql 事务

插图由 玛丽亚·莱塔(MariaLetta)/ free-gophers-pack组成 ,Renee French 创作的地鼠

事务是一系列数据库操作,分为一个单元。 所有操作都可以提交或回滚。 最简单的例子是余额转移。

如果两个帐户之间有余额,那么在Alice和Bob之间进行转帐时,我们需要从Alice余额中减去并在一个操作中增加Bob余额。 该操作SQL代码如下所示:

BEGIN ;
UPDATE users SET balance = balance - 10 WHERE name = 'Alice' ;
UPDATE users SET balance = balance + 10 WHERE name = 'Bob' ;
COMMIT ;

我不会深入探讨Postgres如何在内部处理所有这些问题,而只关注Go示例。

Go有两个主要的not-orm库与Postgres pg / libjackc / pgx一起使用 。 Pgx是更好的选择,我将在示例中使用它。 尽管pg / lib支持database/sql ,但是它不再被维护并且有一些问题,例如发生错误时出现panic ,而不是返回错误。

让我们来看一些更复杂的示例:

假设我们有一个用户表,每个用户都有名称,余额和group_id。 种子表有5个用户,每个用户的余额为100,分为3组。

CREATE TABLE users
	(
		id serial ,
		name text ,
		balance integer ,
		group_id integer ,
		PRIMARY KEY ( id )
	);

INSERT INTO users ( name , balance, group_id )
VALUES ( 'Bob' , 100 , 1 ),
       ( 'Alice' , 100 , 1 ),
       ( 'Eve' , 100 , 2 ),
       ( 'Mallory' , 100 , 2 ),
       ( 'Trent' , 100 , 3 );

我们需要在一个ACID事务中将数据读取到程序中,对其进行处理,然后进行更新。 如果其他人尝试同时更新同一数据,则事务的行为将取决于其隔离级别而有所不同。

隔离度

它理论上有4个隔离级别,Postgres仅支持其中3个。 和4现象,不同的隔离级别应防止。

Read uncommittedRead committed ,可Repeatable read和可Serializable

Read uncommitted等于Read committed ,是Postgres中的默认隔离级别。

隔离级别的目标是防止不良现象:脏读,不可重复读,幻像读和序列化异常。

脏读

基本上,它是读取不同事务中未提交的更改。 所有事务均受Postgres保护,以防脏读,无法读取尚未提交的更改。

隔离的默认级别

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值