事务:由一个或多个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.需要回滚。
原文链接:https://www.f2er.com/postgresql/193166.htmlACID属性:
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.需要回滚。