PostgreSQL TRANSACTION(事务)

TRANSACTION(事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。
数据库事务通常包含了一个序列的对数据库的读/写操作。包含有以下两个目的:
为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。
当事务被提交给了数据库管理系统(DBMS),则 DBMS 需要确保该事务中的所有操作都成功完成且其结果被永久保存在数据库中,如果事务中有的操作没有成功完成,则事务中的所有操作都需要回滚,回到事务执行前的状态;同时,该事务对数据库或者其他事务的执行无影响,所有的事务都好像在独立的运行。

事务的属性

事务具有以下四个标准属性,通常根据首字母缩写为 ACID:

  1. 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
  2. 一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。
  3. 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
  4. 持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中。

例子
某人要在商店使用电子货币购买100元的东西,当中至少包括两个操作:

  1. 该人账户减少 100 元。
  2. 商店账户增加100元。

支持事务的数据库管理系统就是要确保以上两个操作(整个"事务")都能完成,或一起取消,否则就会出现 100 元平白消失或出现的情况。
事务控制
使用下面的命令来控制事务:
BEGIN TRANSACTION:开始一个事务。

  1. COMMIT:事务确认,或者可以使用 END TRANSACTION 命令。
  2. ROLLBACK:事务回滚。

事务控制命令只与 INSERT、UPDATE 和 DELETE 一起使用。他们不能在创建表或删除表时使用,因为这些操作在数据库中是自动提交的。

BEGIN TRANSACTION 命令

事务可以使用 BEGIN TRANSACTION 命令或简单的 BEGIN 命令来启动。此类事务通常会持续执行下去,直到遇到下一个 COMMIT 或 ROLLBACK 命令。不过在数据库关闭或发生错误时,事务处理也会回滚。以下是启动一个事务的简单语法:

BEGIN;
或者
BEGIN TRANSACTION;

COMMIT 命令

COMMIT 命令是用于把事务调用的更改保存到数据库中的事务命令,即确认事务。
COMMIT 命令的语法如下:

COMMIT;
或者
END TRANSACTION;

ROLLBACK 命令

ROLLBACK 命令是用于撤消尚未保存到数据库的事务命令,即回滚事务。
ROLLBACK 命令的语法如下:

ROLLBACK;

实例
创建 COMPANY 表,数据内容如下:

highgo=# select  * from  company ; id | name | age |                       address                        | salary
----+------+-----+------------------------------------------------------+--------1 | 张三 |  32 | 济南                                                 |  200002 | 李四 |  25 | 青岛                                                 |  150003 | 王五 |  23 | 北京                                                 |  200004 | 赵六 |  25 | 上海                                                 |  650005 | 小明 |  27 | 广州                                                 |  850006 | 小红 |  22 | 深圳                                                 |  450007 | 小强 |  24 | 成都                                                 |  10000
(7 行记录)

现在,让我们开始一个事务,并从表中删除 age = 25 的记录,最后,我们使用 ROLLBACK 命令撤消所有的更改。

highgo=# begin ;
BEGIN
highgo=# delete from company where age = 25 ;
DELETE 2
highgo=# rollback ;
ROLLBACK

检查 COMPANY 表,仍然有以下记录:

highgo=# select  * from company; id | name | age |                       address                        | salary
----+------+-----+------------------------------------------------------+--------2 | 李四 |  25 | 青岛                                                 |  150003 | 王五 |  23 | 北京                                                 |  200004 | 赵六 |  25 | 上海                                                 |  650006 | 小红 |  22 | 深圳                                                 |  450007 | 小强 |  24 | 成都                                                 |  100005 | 小明 |  27 | 广州                                                 |  425001 | 张三 |  32 | 济南                                                 |  20000
(7 行记录)

现在,让我们开始另一个事务,从表中删除 age = 25 的记录,最后我们使用 COMMIT 命令提交所有的更改。

highgo=# begin ;
BEGIN
highgo=# delete from company where age = 25 ;
DELETE 2
highgo=# commit  ;
COMMIT

检查 COMPANY 表,记录已被删除:

highgo=# select  * from company; id | name | age |                       address                        | salary
----+------+-----+------------------------------------------------------+--------3 | 王五 |  23 | 北京                                                 |  200006 | 小红 |  22 | 深圳                                                 |  450007 | 小强 |  24 | 成都                                                 |  100005 | 小明 |  27 | 广州                                                 |  425001 | 张三 |  32 | 济南                                                 |  20000
(5 行记录)

PostgreSQL TRANSACTION(事务)相关推荐

  1. ACID+CAP+BASE+Transaction(事务)

    ACID+CAP+BASE+Transaction(事务) 数据库管理系统中事务(transaction)的四个特性(分析时根据首字母缩写依次解释):原子性(Atomicity).一致性(Consis ...

  2. Transaction事务注解和DynamicDataSource动态数据源切换问题解决

     参考:http://www.cnblogs.com/zhwbqd/p/3757060.html 问题描述: 写主库开事务的情况下会导致时不时的将更新/插入操作写入到从库上, 导致mysqlExcep ...

  3. EF Core 2.0中Transaction事务会对DbContext底层创建和关闭数据库连接的行为有所影响...

    数据库 我们先在SQL Server数据库中建立一个Book表: CREATE TABLE [dbo].[Book]([ID] [int] IDENTITY(1,1) NOT NULL,[BookNa ...

  4. 解决基于SpringMVC+MYSQL注解@Transaction事务无效问题

    ##########################万能分割线######################### 最近在使用springmvc结合mysql开发时候,遇到一个问题,基于注解的事务配置在 ...

  5. Spring transaction事务之roll back回滚: rollback-for

    试验方法: 写一个单元测试,调用一个service层方法(发生对数据库进行写操作的方法--insert.update.delete)即可. applicationContext.xml 样子(如何设置 ...

  6. 【Redis学习】Transaction事务管理

    1.相关命令: (1)MULTI 标记一个事务块的开始.事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 EXEC 命令原子性(atomic)地执行. 返回值:总是返回 OK . redis ...

  7. PostgreSQL数据库事务系统——phenomena

    读写并发操作引发的数据异常现象 The isolation level specifies the kind of phenomena that can occur during the execut ...

  8. Transaction事务传播行为

    事务传播行为 Spring的7种事务传播行为 代码演示 PROPAGATION_REQUIRED PROPAGATION_SUPPORTS PROPAGATION_MANDATORY PROPAGAT ...

  9. PostgreSQL 怎么通过vacuum 加速事务ID回收的速度 (翻译)

    此文为翻译文字原文连接在文字最下方 经历上次transaction id 回收报警的问题后,除了上次总结后,发现对于transaction id 的回收的问题还是处于一个急需在学习的过程,所以有了下面 ...

最新文章

  1. 新趋势:工具赋能企业数字化转型,驱动组织升级!
  2. 每日一皮:这个食堂好...
  3. 如何設定 VS2008 讓 HTML 在格式化排版時不要破壞版面
  4. python实现pdf转excel_python pdf转Excel
  5. 一般动态规划问题合集(Leetcode题解-Python语言)
  6. 【实战】烂泥:一次纠结的系统安装
  7. Coursera NLP 笔记02
  8. 页式管理--物理地址计算问题小结
  9. oracle分区实战,Oracle分区实战分享
  10. 数学分析:定积分的概念
  11. 自适应各终端懒人网址导航源码v1.6
  12. 面向对象七大设计原则
  13. win10下ctfmon.exe系统程序误删的解决方案
  14. cass坡度土方计算案例_四面放坡且坡度不同的工程土方,CASS怎么算?
  15. 手机停机后你们知道怎么打电话?教你鲜为人知的手机锦囊
  16. 揭开关于激光雷达传感器的常见误区——第二部分
  17. 基于ResNetRS的宝可梦图像识别
  18. precision 为什么和recall成反比
  19. python_cv2_图片黑白操作
  20. 形式逻辑(普通逻辑)6:复合判断

热门文章

  1. word 2010打开“书法字帖”时无响应
  2. java数据结构停车场管理系统_《数据结构》实验设计报告-停车场管理系统
  3. 谷歌浏览器插件最新版 v0.3.0 抓取1688、京东、拼多多 商品图片|文描|视频|规格|属性等信息 并打包下载
  4. 进口产品需要做3c认证么?如何办理?
  5. 码农创业—人流量的计算方法
  6. 让drawText绘出中文
  7. 数字图像处理与模式识别
  8. 软件测试工程师工资怎么样?高吗?
  9. ERP解决方案在印度尼西亚
  10. 单片机实现数字滤波——加权平均滤波