【postgresql 基础入门】事物transaction的开启,提交,回滚命令,自动提交设置

这篇具有很好参考价值的文章主要介绍了【postgresql 基础入门】事物transaction的开启,提交,回滚命令,自动提交设置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

事务transaction

专栏内容

  • postgresql内核源码分析
  • 手写数据库toadb
  • 并发编程

个人主页:我的主页
管理社区:开源数据库
座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

系列文章

  • 入门准备
  • postgrersql基础架构
  • 快速使用
  • 初始化集群
  • 数据库服务管理
  • psql客户端使用
  • pgAdmin图形化客户端
  • 数据库的使用
  • 创建数据库
  • 数据库操作
  • 表的使用
  • 表的创建
  • 表的操作
  • 数据查询
  • 数据查询
  • 多表联合查询
  • 数据操作
  • 插入数据的方式

一、概述


在数据库中,事务是所有工作任务的最小单位,它里面可以包括一条SQL,也可以包括多条SQL,它们一起完成。本文就来介绍postgresql中的事务命令beginendrollback的使用,在我们平常SQL中事务的应用。

二、事务介绍


在数据库原理当中,事务有四个特性ACID,这里再来回顾一下:

  • 原子性 Atomicity,事务内的所有操作一起完成,或者全部失败,事务是一个整体,不管包含多少条SQL,它们之间不可分割;
  • 一致性 Consistency,事务内修改的数据是有效的,同时满足定义的所有约束限制;
  • 隔离性 Isolation,不同的事务之间相互隔离,事务执行不受其它事务执行中间状态的影响,并发执行的事务互不干扰;
  • 持久性 Durability,事务被提交后,其对数据库的改变是永久的记录的,不会因为其它操作或者数据库的故障而受影响;即使数据库发生故障,也能够恢复到这个持久性的状态下;

数据库的任务以事务为单位进行执行,而事务的这四个特性,保证了数据库事务的可靠性和稳定性,即使在多任务并发环境下,也能安全有效的执行,不会出现数据不一致或冲突。

三、事务命令


在postgresql中,事务操作基础命令有:

  • 开启事务
  • 提交事务
  • 回滚事务

开启事务

开始一个事务的命令为 BEGIN,也可以写为BEGIN WORKBEGIN TRANSACTION, 标识一个事务开始。

下面准备一张表,然后插入一条数据,表还是前面博客常用的产品表,数据可以自行添加;

-- 创建产品表  
CREATE TABLE products (  
    product_id INT PRIMARY KEY,  
    product_name VARCHAR(255) NOT NULL,  
    price DECIMAL(10, 2) NOT NULL,  
    category VARCHAR(255)  
); 

然后在命令行客户端中开始一个事务

postgres=# begin;
BEGIN
postgres=*#
postgres=*# select * from products ;
 product_id | product_name |  price  | category
------------+--------------+---------+----------
          2 | shirt        |  202.40 | type2
          3 | cake         |   37.80 | type4
          5 | hat          |   88.40 | type2
          6 | milk         |   19.80 | type4
          1 | iphone       | 8999.01 | type5
          7 | keyboard     |   92.01 | type5
          4 | pencil       |   12.00 | type1
(7 rows)

postgres=*# update products set price = 8.2 where product_id=4;
UPDATE 1

可以看到命令行提示符postgres=*#中多了一个*,说明当前在事务中,此时可以继续执行SQL,而这些SQL在提交之前都会属于同一个事务。

提交事务

事务中的操作执行完成后,就需要提交事务,让操作结果真正生效。
事务的提交命令为COMMIT, 或者对应的为COMMIT WORK或者COMMIT TRANSACTION,标识一个事务中的所有操作都真正持久的生效。

接上个练习,将事务提交

postgres=*# commit;
COMMIT
postgres=#

可以看到事务提交命令执行后,命令行提示符中的*消失了,说明当前没有在事务当中。

回滚事务

在一个事务中包含很多操作时,如果错误的增加了一个操作时,这个事务就不能被提交,需要回退到事务开始之前的状态,然后重新开始,此时我们就要用到事务回滚命令ROLLBACK,或者对应的为ROLLBACK WORK或者ROLLBACK TRANSACTION

postgres=# begin;
BEGIN
postgres=*# select * from products ;
 product_id | product_name |  price  | category
------------+--------------+---------+----------
          2 | shirt        |  202.40 | type2
          3 | cake         |   37.80 | type4
          5 | hat          |   88.40 | type2
          6 | milk         |   19.80 | type4
          1 | iphone       | 8999.01 | type5
          7 | keyboard     |   92.01 | type5
          4 | pencil       |    8.20 | type1
(7 rows)

postgres=*# update products set price = 7 where product_id=4;
UPDATE 1
postgres=*# select * from products ;
 product_id | product_name |  price  | category
------------+--------------+---------+----------
          2 | shirt        |  202.40 | type2
          3 | cake         |   37.80 | type4
          5 | hat          |   88.40 | type2
          6 | milk         |   19.80 | type4
          1 | iphone       | 8999.01 | type5
          7 | keyboard     |   92.01 | type5
          4 | pencil       |    7.00 | type1
(7 rows)

postgres=*# rollback ;
ROLLBACK
  • 首先开启一个新事务;
  • 然后查询products表的数据,更新产品id为4的价格为7
  • 再次查询products表的数据,可以看到id为4的产品价格更新为7,此时还在事务中,并不是持久结果;
  • 最后回滚事务,事务中的操作都不会生效,数据状态回退出事务执行前的状态

下面我们验证一下数据库中的数据

postgres=# select * from products ;
 product_id | product_name |  price  | category
------------+--------------+---------+----------
          2 | shirt        |  202.40 | type2
          3 | cake         |   37.80 | type4
          5 | hat          |   88.40 | type2
          6 | milk         |   19.80 | type4
          1 | iphone       | 8999.01 | type5
          7 | keyboard     |   92.01 | type5
          4 | pencil       |    8.20 | type1
(7 rows)

postgres=*#

可以看到数据库中产品ID为4的价格仍为8.20,没有因为上一个事务操作而变化;

四、自动提交配置


在前面的博客分享中,介绍了很多的SQL种类,也有很多案例,并没有看到事务的影子,这是怎么回事呢?

这个秘密就在我们使用的客户端中,拿命令行客户端psql看一下;

postgres=# \echo :AUTOCOMMIT
on

默认参数AUTOCOMMIT是打开的,这个参数是对客户端生效的,所以在我们输入单条SQL时,每个SQL默认为一个单独的事务,客户端帮我们自动提交了,使得我们看不到事务的效果。

关闭自动提交开关后,看一下效果:

postgres=# \set AUTOCOMMIT off
postgres=# \echo :AUTOCOMMIT
off

执行一条SQL

postgres=# select * from products ;
 product_id | product_name |  price  | category
------------+--------------+---------+----------
          2 | shirt        |  202.40 | type2
          3 | cake         |   37.80 | type4
          5 | hat          |   88.40 | type2
          6 | milk         |   19.80 | type4
          1 | iphone       | 8999.01 | type5
          7 | keyboard     |   92.01 | type5
          4 | pencil       |   12.00 | type1
(7 rows)

postgres=*#
postgres=*# commit;
COMMIT
postgres=#

这时候会看到命令行提示符postgresql=*#中间会有一个*的符号,这说明还在事务中,需要手动提交事务,执行COMMIT之后才会消失。

五、总结


通过本文的分享,将SQL语句与数据库理论中的事务联系起来,数据库系统中任务都是以事务为单位进行执行,保障数据的完整性,一致性以及持久性。在我们执行SQL时,其实也是通过事务进行提交生效的,当然在其它客户端或者JDBC中也是一样的,可以利用事务的特性来保持数据一致性。

六、结尾


非常感谢大家的支持,在浏览的同时别忘了留下您宝贵的评论,如果觉得值得鼓励,请点赞,收藏,我会更加努力!

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。

注:未经同意,不得转载!文章来源地址https://www.toymoban.com/news/detail-839461.html

到了这里,关于【postgresql 基础入门】事物transaction的开启,提交,回滚命令,自动提交设置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • @Transactional-单元测试中的回滚

    今天在JUnit单元测试中测试接口时,突然发现idea写入数据库成功,但是数据库中没有数据 去掉@Rollback注解后,idea中事务正常执行,mysql数据库中依然是没有数据的,查看日志发现 明显事务虽然执行成功了但是回滚了,仔细一看问题出在@Transactional,spring支持声明式事务,通过

    2024年02月15日
    浏览(41)
  • 单元测试JunitTest加@Transactional事务自动回滚

    在测试事务传播行为的时候,使用单位测试加了@Transactional,一开始是正常,后面出现了异常,即使没有报错的情况下,事务也会自动回滚 Rolled back transaction for test,数据都回滚了 1、方法加注解@Rollback(false) 该注解是直接关闭了自动回滚,异常情况下,数据也不会回滚 数据成

    2024年02月07日
    浏览(75)
  • @Transactional注解作用,不生效的场景,事务回滚

    声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。 简而言之,@Transactional注解在代码执行出错的时候能够进行事务的回滚。 在启动类上添加@EnableTransac

    2024年02月10日
    浏览(47)
  • 支付宝一面:多线程事务怎么回滚?说用 @Transactional 可以回去等通知了!

    1,最近有一个大数据量插入的操作入库的业务场景,需要先做一些其他修改操作,然后在执行插入操作,由于插入数据可能会很多,用到多线程去拆分数据并行处理来提高响应时间,如果有一个线程执行失败,则全部回滚。 2,在spring中可以使用 @Transactional 注解去控制事务,

    2024年02月08日
    浏览(78)
  • Sourcetree 回滚提交和重置提交

    1.首先创建了4次的代码提交 2.回滚提交到某一次提交 选中需要回滚到的提交的分支(此次提交的内容将会被删掉),此时是没有冲突情况! 可以看到,这里是反向的一个操作,删除了第三次的提交内容! 直接推送即可! 3.在第三次提交的代码位置,新增第五次的代码提交

    2024年02月09日
    浏览(48)
  • 【GIT】回滚远程提交

    前提: 某次远程提交不符合预期但已经push,想回滚(删除)。 一.获取commit id(想回滚到哪次commit之后) idea的获取方式如下图(右键commit log下的某次提交- Copy Revision Number) 二. 使用git bash进行回滚 一共分成两步 1.回滚到当前commit 9d09c…切换成刚才复制的Revision Number 2.强制提交到远

    2024年02月05日
    浏览(57)
  • SourceTree 重置提交、合并、撤销、回滚

    SourceTree重置当前分支到此次提交 使用场景: 已提交未推送的修改撤销、想把某一次的错误修改全部撤销 当前发布代码有bug需要切到上次提交发布版本 Git中的HEAD解释 # 使用最新一次提交重制暂存区 git reset HEAD -- filename # 使用最新一次提交重制暂存区和工作区 git reset --hard

    2023年04月25日
    浏览(34)
  • SourceTree中“提交回滚”和“重置到此次提交”的区别

    用一个例子来说明: 若只需要撤销2的提交,1、3保留,则点击记录2右键“提交回滚”,则本地的2被回滚,推送后线上分支也回滚了。(恢复刚刚到操作:点击“提交回滚”后的右键再次“提交回滚”,则撤销了刚刚的回滚,即1、2、3都在) 注意: 提交回滚时,2的提交记录

    2024年02月05日
    浏览(40)
  • idea 回滚某次提交的代码

    直接看如下图解 1、右击项目,查看提交历史 2、选择要回滚的版本,点击回滚 3、push回滚的内容:双击该回滚记录,弹出后,检查一下回滚的内容,没问题就直接点击push按钮即可 Undo Commit 已经Commit但是还未push的代码,不回滚你所修改的代码,换言之, 撤销你的Commit动作 。

    2023年04月14日
    浏览(42)
  • idea git回滚之前提交记录

    目录 操作方式 类型作用 前言-与正文无关         生活远不止眼前的苦劳与奔波,它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中,我们往往容易陷入工作的漩涡,忘记了停下脚步,感受周围的世界。让我们一起提醒自己,要适时放慢脚步,欣

    2024年01月17日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包