基本概念

事务 Transaction 是 数据库管理系统DBMS 执行过程中的一个逻辑单元,是一个 sql命令组成的序列。

其特点在于,当事务被提交DBMS后,DBMS需要确保所有的操作被完成;如果事务中有的操作没有成功完成,那么所有操作都将回滚,回滚到事务提交之前的状态

属性

事务具有以下四个标准属性

原子性:事务作为一个整体被执行,相当于一个原子

一致性:确保修改前后数据库都满足约束

隔离性:多个事务能并发执行,互不影响

持久性:已被提交的事务对数据库的修改应该永久保存在数据库中

适用场景

某人在商店使用电子货币支付100元,包括以下两个操作:

1. 消费者账户减少100元

2. 商家账户增加100元

事务的作用就是保证这两个操作要么都发生,要么都不发生,否则可能出现100元凭空消失。

事务控制

使用如下命令控制事务

begin 或者 begin transaction:开始一个事务

commit 或者 end transaction:提交事务,执行一系列sql

rollback:事务回滚

在开始一个事务后,除非遇到 commit 或者 rollback 命令,事务才会被执行;

如果还没遇到 commit 或者 rollback,数据库发生异常,也会自动回滚。

注意,事务命令只能用于 insert、delete、update 操作,而其他命令,比如建表、删表,会被自动提交。

总结一下:事务需要手动开启,手动提交;而且这种方式能提高操作效率。

实例

假设有如下表

id | name  | age | address   | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000

操作1:开始事务,从表中删除年龄为25的记录,最后用rollback撤销所有操作

runoobdb=# BEGIN;
DELETE FROM COMPANY WHERE AGE = 25;
ROLLBACK;

结果如下

id | name  | age | address   | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000

我们发现原表没有任何改变

操作2:开始事务,从表中删除年龄为25的记录,最后用commit提交事务

runoobdb=# BEGIN;
DELETE FROM COMPANY WHERE AGE = 25;
COMMIT;

此时我们发现表中age为25的已删除。

Python 示例

time.clock()
conn = psycopg2.connect(host='172.16.89.80',user="postgres",password="postgres",database="postgres")
cur = conn.cursor()
cur.execute("BEGIN TRANSACTION") # 开始事务 if __name__=='__main__':
for i in range(0,1000):
cur.execute('INSERT INTO test(a, b, c, d) VALUES (%d, %d, %d, %d);'%(i, i, i, i))
cur.execute('commit') # 提交事务
cur.close()
conn.close()
print(time.clock())

执行成功,耗时约 2s

继续尝试

上面手动开始了事务,后面我做了如下尝试,发现耗时只有 1s      【commit 优化】

time.clock()
conn = psycopg2.connect(host='172.16.89.80',user="postgres",password="postgres",database="postgres")
cur = conn.cursor() if __name__=='__main__':
for i in range(0,1000):
cur.execute('INSERT INTO test(a, b, c, d) VALUES (%d, %d, %d, %d);'%(i, i, i, i))
conn.commit()
cur.close()
conn.close()
print(time.clock())

执行了一系列sql,最后来个 commit,同样执行成功,且耗时更少,我猜测是python自动开始了事务,以 commit 命令提交,无需手动开始。  【后续有空会验证下这个猜测】

参考资料:

https://www.runoob.com/postgresql/postgresql-transaction.html

PostgreSQL-事务与commit优化的更多相关文章

  1. EntityFramework之异步、事务及性能优化(九)

    前言 本文开始前我将循序渐进先了解下实现EF中的异步,并将重点主要是放在EF中的事务以及性能优化上,希望通过此文能够帮助到你. 异步 既然是异步我们就得知道我们知道在什么情况下需要使用异步编程,当等待 ...

  2. PostgreSQL事务实现

    事务简介 事务管理器:有限状态机 日志管理器 CLOG:事务的执行结果 XLOG:undo/redo日志 锁管理器:实现并发控制,读阶段采用MVCC,写阶段采用锁控制实现不同的隔离级别 Postgre ...

  3. [转帖]PostgreSQL 参数调整(性能优化)

    PostgreSQL 参数调整(性能优化) https://www.cnblogs.com/VicLiu/p/11854730.html 知道一个 shared_pool 文章写的挺好的 还没仔细看 ...

  4. postgresql事务

    查看更多教程:http://www.gitbook.net/postgresql/2013080567.html pgsql事务与并发控制 事务与并发控制 数据库几大特性: ACID: Atomici ...

  5. PostgreSQL 参数调整(性能优化)

    昨天分别在外网和无外网环境下安装PostgreSQL,有外网环境下安装的相当顺利.但是在无外网环境下就是两个不同的概念了,可谓十有八折.感兴趣的同学可以搭建一下. PostgreSQL安装完成后第一件 ...

  6. Redis 实战 —— 07. 复制、处理故障、事务及性能优化

    复制简介 P61 关系型数据库通常会使用一个主服务器 (master) 向多个从服务器 (slave) 发送更新,并使用从服务器来处理所有读请求. Redis 也采用了同样的方法实现自己的复制特性,并 ...

  7. SQL Server提高事务复制效率优化(四)修改数据同步过程优化

    1.原理       我说的数据修改同步过程指的是在快照生成完毕,分发代理将快照应用于订阅服务器完成订阅服务器初始化后,发布服务器后续的更改同步到订阅服务器过程,这也就是我们常常关注的延迟.此过程主要 ...

  8. SQL Server提高事务复制效率优化(一)总体概述

      随着公司业务的发展,数据量增长迅速,在解决Scale Out的同时,还要考虑到主从的复制延迟问题,尽量降到1s以内满足线上业务,如果不调整,SQL Server默认的配置可能平均要3s左右.生产的 ...

  9. postgresql - 事务

    1.事务的使用 begin;//开启关闭自动提交的事务 insert into testtab01 values(0); rollback;//事务回滚 2.SavePoint的使用 begin;// ...

随机推荐

  1. Spring boot之返回json数据

    1.步骤: 1. 编写实体类Demo 2. 编写getDemo()方法 3. 测试 2.项目构建 编写实体类Demo package com.kfit; /** * 这是一个测试实体类. */ pub ...

  2. Java实现QQ微信轰炸机1.2(斗图乞丐版)

    之前有小可爱评论可以实现斗图的功能,原理上是行的通的,所以我就稍微改了一下,能够实现单个图片循环轰炸,如果大家感兴趣也可以自己探究实现多张图片循环轰炸,不废话了,直接上源码package QQWcha ...

  3. Golang Singleton

    package example import ( "fmt" "sync") var m *singletonvar once sync.Once func G ...

  4. JSP之Bean

    <jsp:useBean id=" " class" "/>创建JavaBean对象,并把创建的对象保存到域对象 比如:<jsp:useBea ...

  5. mybatis 中的 update 返回值

    摘自:https://www.jianshu.com/p/80270b93082a 如果定义一个如下的update函数,那么这个函数的返回值到底是啥意思呢?是受影响的行数吗? 验证之前我们先看看数据库 ...

  6. linux系统问题排查

    通常linux系统出问题了 先看系统日志 tail -f /var/log/messages

  7. java JIT

    JVM 即时编译器即时编译器 (Just In Time Compiler) 简称JIT JAVA程序最初是通过解释器 (Interpreter) 进行解释执行的,当 JVM 发现某个方法或代码块运行 ...

  8. Error-ASP.NET:The Value of property CloneFrom can not be empty string!

    ylbtech-Error-ASP.NET:The Value of property CloneFrom can not be empty string! 1.返回顶部 1. “/”应用程序中的服务 ...

  9. python - lambda 函数使用

    # if we need it only once and it's quite simple def make_incrementor(n): return lambda x: x + n f = ...

  10. 找回从pycharm中删除的文件及文件夹