官术网_书友最值得收藏!

  • Mastering PostgreSQL 9.6
  • Hans Jurgen Schonig
  • 404字
  • 2021-07-09 19:57:11

Working with PostgreSQL transactions

PostgreSQL provides you with a highly advanced transaction machinery that offers countless features to developers and administrators alike. In this section, it is time to look at the basic concept.

The first important thing to know is this: in PostgreSQL, everything is a transaction. If you send a simple query to the server, it is already a transaction. Here is an example:

test=# SELECT now(), now();
now | now
------------------------------+------------------------------
2016-08-30 12:03:27.84596+02 | 2016-08-30 12:03:27.84596+02
(1 row)

In this case, the SELECT statement will be a separate transaction. If the same command is executed again, different timestamps will be returned.

Keep in mind that the  now() function will return the transaction time. The SELECT statement will, therefore, always return two identical timestamps.

If more than one statement has to be part of the same transactions, the BEGIN clause must be used:

test=# h BEGIN 
Command: BEGIN
Description: start a transaction block
Syntax:
BEGIN [ WORK | TRANSACTION ] [ transaction_mode [, ...] ]

where transaction_mode is one of:

ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ
| READ COMMITTED | READ UNCOMMITTED }
READ WRITE | READ ONLY
[ NOT ] DEFERRABLE

The BEGIN clause will ensure that more than one command will be packed into a transaction. Here is how it works:

test=# BEGIN;
BEGIN
test=# SELECT now();
now
-------------------------------
2016-08-30 12:13:54.839277+02
(1 row)
test=# SELECT now();
now
-------------------------------
2016-08-30 12:13:54.839277+02
(1 row)
test=# COMMIT;
COMMIT

The important point here is that both timestamps will be identical. As mentioned earlier, we are talking about transaction time here.

To end the transaction, COMMIT can be used:

test=# h COMMIT 
Command: COMMIT
Description: commit the current transaction
Syntax:
COMMIT [ WORK | TRANSACTION ]

There are a couple of syntax elements here. You can just use COMMIT, COMMIT WORK, or COMMIT TRANSACTION. All three options have the same meaning. If this is not enough, there is more:

test=# h END 
Command: END
Description: commit the current transaction
Syntax:
END [ WORK | TRANSACTION ]

The END clause is the same as the COMMIT clause.

ROLLBACK is the counterpart of COMMIT. Instead of successfully ending a transaction, it will simply stop the transaction without ever making things visible to other transactions:

test=# h ROLLBACK 
Command: ROLLBACK
Description: abort the current transaction
Syntax:
ROLLBACK [ WORK | TRANSACTION ]

Some applications use ABORT instead of ROLLBACK. The meaning is the same.

主站蜘蛛池模板: 光泽县| 壤塘县| 寿光市| 西华县| 吉林市| 山阳县| 文成县| 镇坪县| 平山县| 关岭| 新乡市| 哈密市| 固镇县| 饶平县| 韶关市| 临城县| 阳曲县| 宿松县| 连云港市| 凤山县| 南宫市| 北安市| 泌阳县| 仪征市| 建宁县| 沙田区| 正镶白旗| 五台县| 大名县| 特克斯县| 清原| 吉隆县| 易门县| 红安县| 玉山县| 莱州市| 齐齐哈尔市| 苍南县| 昌吉市| 咸丰县| 溆浦县|