Postgresql事务笔记

事务:由一个或多个sql语句组成,使系统从一个一致状态到另一个一致状态,或者两种状态的更新都同时工作,或同种状态都应该回滚。
ACID属性
A 原子性:作为一个整体,要么都做,要么都不做;
C 一致性:从一个一致的状态到另一个一致的状态;
I 隔离性:用户的操作不会受到同一时间段内其他用户操作的影响。
D:持久性:事务提交后,即使操作系统故障、硬件故障等,它仍将保持一个一致的状态。实现方法:使用预写式日志(WAL)。

隔离级别
1.未提交的读取:隔离级别最低,一般不用,会发生脏读。
2.提交的读取:Postgresql的默认隔离级别。解决了脏读(对相同的行进行两次读取,获取的是不同的数据)
3.可重复读:复合select自身标准的结果集被锁定,不会接受另一个会话的更改。解决了幻读(执行两次相同的查询,得到不同的结果集)
4.序列化:事务按顺序执行。

MH=> show default_transaction_isolation;
 default_transaction_isolation 
-------------------------------
 read committed
(1 row)
MH=> 

当事务的隔离级别为read committed(默认级别)时
如果进行update操作,试着更改被另一个对话更改的数据,第一个事务update时会锁表,此时第二个事务update将处于等待状态,第一个事务commit后,第二个事务将继续执行update,得到第二个事务update后的值。
如果是insert和delete一个表中的一条数据时,当第一个事务delete时,会锁住该条数据,此时第二个事务将等待,是无法insert的,第一个事务commit后,第二个事务则可执行insert,然后commit.
如果insert和delete的不是相同的数据,则可同时操作,互不影响。

当事务的隔离级别为repeatable read时
如果进行update操作,试着更改被另一个对话update的数据(比如某一条),我们将得到一个错误ERROR:could not serialize access due to concurrent update。
如果两个事务update的不是同一条数据,则可以更改,不会返回错误。
如果是insert和delete一个表中的一条数据时(不需要是同一条),当delete后,另一个事务insert会报current transaction is aborted, commands ignored until end of transaction block.需要回滚。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值