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 行记录)