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 / lib和jackc / 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 uncommitted
, Read committed
,可Repeatable read
和可Serializable
。
Read uncommitted
等于Read committed
,是Postgres中的默认隔离级别。
隔离级别的目标是防止不良现象:脏读,不可重复读,幻像读和序列化异常。
脏读
基本上,它是读取不同事务中未提交的更改。 所有事务均受Postgres保护,以防脏读,无法读取尚未提交的更改。
隔离的默认级别