PostgreSQL中事务

1.事务的特性

  • 原子性:对数据的修改,要么全都执行,要么全都不执行。
  • 一致性:事务完成时,所有数据保持一致状态。
  • 隔离性:事务不会查看中间状态的数据。
  • 持久性:事务完成后,对系统的影响是永久性的。

2.查看事务是否自动提交

\echo :AUTOCOMMIT

    如果返回on,则每执行一条SQL语句,都会自动提交。返回off,则不会自动提交。

3.关闭自动提交

\set AUTOCOMMIT off

4.事务实例

    关闭自动提交,或者使用begin启动一个事务之后,就可以测试事务中的回退和提交了。

4.1 回退(rollback)

     插入数据,回退。然后查询表中的数据,可以发现数据没有插入成功。

mydb=#insert into person values(1,'April');
INSERT 0 1
mydb=# rollback;
ROLLBACK
mydb=# select * from person;
+----+------+
| id | name |
+----+------+
+----+------+
(0 行记录)

4.2 提交(commit)

     插入数据,提交。然后查询表中的数据,可以发现数据插入成功。

mydb=# insert into person values(1,'April');
INSERT 0 1
mydb=# commit;
COMMIT
mydb=# select * from person;
+----+-------+
| id | name  |
+----+-------+
|  1 | April |
+----+-------+
(1 行记录)

5.保存点(SAVEPOINT)

    PostgreSQL支持保存点(SAVEPOINT),把一个大的事务分成几个部分,第一部分成功后,可以建一个保存点,或后面的执行失败,则回滚到这个保存点,而不必把整个事务都回滚掉。

    先插入两条数据,建立保存点firstPoint。

mydb=# insert into person values(1,'April');
INSERT 0 1
mydb=# insert into person values(2,'Harris');
INSERT 0 1
mydb=# savepoint  firstPoint;
SAVEPOINT

     插入数据出现错误,回滚到上一个保存点。

mydb=# insert into person values(2,'Harris',1);
错误:  INSERT 的表达式多于指定的字段数
第1行insert into person values(2,'Harris',1);
mydb=# rollback to savepoint  firstPoint;
ROLLBACK

    继续插入数据,然后提交事务。

mydb=# insert into person values(3,'Dave');
INSERT 0 1
mydb=# commit;
COMMIT

    查看数据,可以发现先后插入的数据都成功了。

mydb=# select * from person;
+----+--------+
| id |  name  |
+----+--------+
|  1 | April  |
|  2 | Harris |
|  3 | Dave   |
+----+--------+
(3 行记录)

猜你喜欢

转载自blog.csdn.net/liyazhen2011/article/details/83037616
今日推荐