• 事务时需要在同一处理单元中执行的一系列更新处理的集合。通过使用事务,可以对数据库中的数据更新处理的提交和取消进行管理。
  • 事务处理的终止指令包括COMMIT(提交处理)和ROLLBACK(取消处理)两种。
  • DBMS的事务具有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)四种特性,统称为ACID特性。

举个例子,比如你在一个销售部门工作,这个时候领导分配给你一个工作:

“zifeiy,我们决定把运动T恤的销售单价下调100元,同时把T恤衫的销售单价上浮100元,麻烦你去更新一下数据库。”

那么其实这么一个任务中时包含两个步骤的:

  1. 将运动T恤的销售单价降低100元:
UPDATE Product
SET sale_price = sale_price - 100
WHERE product_name = '运动T恤';
  1. 将T恤衫的销售单价上浮100元:
UPDATE Product
SET sale_price = sale_price + 100
WHERE product_name = 'T恤衫';

上述连个操作要作为同一个处理单元执行。

也就是说:“要么都执行,要么都不执行。”

遇到这种需要在同一个处理单元中执行一系列更新操作的情况,一定要使用事务来进行处理。

创建事务

如果想在DBMS中创建事务,可以按照如下语法结构编写SQL语句:

事务开始语句;

DML语句1;
DML语句2;
DML语句3;
…… 事务结束语句(COMMIT或者ROLLBACK);

使用事务开始语句和事务结束语句,将一系列DML语句(INSERT/UPDATE/DELETE语句)括起来,就实现了一个事务处理。

事务的开始语句在不同的DBMS中有区别:

  • SQL Server、PostgreSQL:BEGIN TRANSACTION
  • MySQL:START TRANSACTION
  • Oracle、DB2: 无

在PostgreSQL中更新商品信息的事务:

BEGIN TRANSACTION;

    -- 将运动T恤的销售单价降低100元
UPDATE Product
SET sale_price = sale_price - 100
WHERE product_name = '运动T恤';
-- 将T恤衫的销售单价上浮100元
UPDATE Product
SET sale_price = sale_price + 100
WHERE product_name = 'T恤衫'; COMMIT;
  • COMMIT:提交处理

    • COMMIT的流程 = 直线进行
  • ROLLBACK:取消处理
    • ROLLBACK的流程 = 掉头回到起点

事务回滚的例子:

BEGIN TRANSACTION;

    -- 将运动T恤的销售单价降低100元
UPDATE Product
SET sale_price = sale_price - 100
WHERE product_name = '运动T恤';
-- 将T恤衫的销售单价上浮100元
UPDATE Product
SET sale_price = sale_price + 100
WHERE product_name = 'T恤衫'; ROLLBACK;

上述事务处理执行之后,表中的数据不会发生任何改变。这是因为执行最后一行的ROLLBACK之后,所有的处理都被取消了。因此,回滚执行起来就无需像提交时那样小心翼翼了(即使是想要提交的情况,也只需要重新执行事务就可以了)。

PostgreSQL学习笔记——事务的更多相关文章

  1. MySQL学习笔记-事务相关话题

    事务机制 事务(Transaction)是数据库区别于文件系统的重要特性之一.事务会把数据库从一种一致状态转换为另一个种一致状态.在数据库提交工作时,可以确保其要么所有修改都已经保存了,要么所有修改都 ...

  2. Postgresql学习笔记

    一:数据类型 主要有三大类以及其他一些杂项类型: 数值型.字符型.日期型. 数值型: 名称 描述 存储大小 范围 smallint 存储整数,小范围 2字节 -32768 至 +32767 integ ...

  3. postgresql学习笔记--基础篇 - copy

    1. psql 导入/导出数据 psql支持文件数据导入到数据库,也支持数据库表数据导出到文件中. COPY命令和\copy 命令都支持这两类操作,但两者有如下区别: COPY 命令是SQL命令,\c ...

  4. postgresql学习笔记--基础篇 -psql工具

    --创建用户 CREATE ROLE pguser WITH ENCRYPTED PASSWORD 'pguser'; --创建表空间目录 mkdir -p /database/pg10/pg_tbs ...

  5. postgresql学习笔记--基础篇

    1. 客户端程序和服务器端程序 1.1 客户端程序 Command Example Describe clusterdb clusterdb -h pghost1 -p 1921 -d mydb Cl ...

  6. PostgreSQL学习笔记——摘要

    因为PostgreSQL和MySQL.DB2等数据库均遵循SQL语法,所以这篇随笔仅记录一些PostgreSQL中和别的数据库有差别或之前学习中遗漏的地方,以及一些我觉得比较重点的地方. 通过psql ...

  7. PostgreSQL学习笔记(二)-安装pgAdmin

    继上篇安装PostgreSQL后,我们需要安装一个PostgreSQL的图形化管理工具. pgadmin管理工具 创建Python的虚拟环境 cd /root/venv python -m venv ...

  8. PostgreSQL学习笔记(一)-安装PostgreSQL

    PostgreSQL官网:https://www.postgresql.org/docs/11/index.html1.如何安装2.如何修改配置文件3.如何设置自动启动4.如何修改数据用户密码 本文环 ...

  9. jsp+postgresql学习笔记(1)用户登录与注册

    前期准备: tomcat的安装与配置(略) jdk的安装与配置(略) eclipse软件安装与配置(略) webstrom软件或IDEA的安装与配置(大概用了IDEA就不需要eclipse了,但是怎么 ...

随机推荐

  1. test20181102 空间复杂度 和 test20181030 数独

    空间复杂度 考场做法 前有时间复杂度,后有空间复杂度. 但是这题不会有CE情况,所以较为好写. 就用map存复杂度,单层循环就搞定了. 至于判断维度的方法,我是用快读从字符串中读入. 然后不管常数,把 ...

  2. javascript权威指南第20章 JSON

    //20.1 语法 //JAVASCRIPT 是对JSON数据支持的. //JSON 可以申明三种类型的值 简单值("hello world") 对象({"name&qu ...

  3. idea创建springmvc项目创部署成功,但访问controller层报错404

    这个问题网上有很多解决问题,检查配置文件是否正确?controller注解是否扫描?项目启动是否成功等等. 访问报错404,而且后台也没错误,归根结底还是访问路径错了. 1.如图,idea配置tomc ...

  4. bzoj 1415: [Noi2005]聪聪和可可 期望dp+记忆化搜索

    期望dp水题~ 你发现每一次肯定是贪心走 2 步,(只走一步的话就可能出现环) 然后令 $f[i][j]$ 表示聪在 $i$,可在 $j$,且聪先手两个人碰上面的期望最小次数. 用记忆化搜索转移就行了 ...

  5. learning scala How To Create Implicit Function

    println("Step 1: How to create a wrapper String class which will extend the String type") ...

  6. 2019-2020 ICPC, NERC, Southern and Volga Russian Regional Contest

    目录 Contest Info Solutions A. Berstagram B. The Feast and the Bus C. Trip to Saint Petersburg E. The ...

  7. CDW数学小笔记

    今天我们来做一道题目. 输入正整数\(n\)(\(\le 10^{15}\)),求\(x^2+y^2=n^2\)的整数解的个数. 也就是圆心为原点,半径为\(n\)的圆上整点的数量. 为了得到更普遍的 ...

  8. swoole入门到实战打造高性能赛事直播平台☆

    ​ 第1章 课程介绍 本章主要是介绍了swoole的一些特性,以及使用场景,并且分享了swoole在其他公司的一些案例,最后重点讲解了swoole学习的一些准备工作. 第2章 PHP 7 源码安装 本 ...

  9. centos7 安装 Mysql 5.7.27,详细完整教程

    1. 下载 MySQL yum包 wget http://repo.mysql.com/mysql57-community-release-el7-10.noarch.rpm   2.安装MySQL源 ...

  10. journalnode Can't scan a pre-transactional edit log 异常处理

    由于数据磁盘爆满,达到100%,导致journalnode宕掉,在启动journalnode以后,查看日志,提示Can't scan a pre-transactional edit log,这个时候 ...