Table of Contents

事务的特性

并行事务的问题

事务隔离级别

Odoo事务隔离级别

odoo事务控制

 
 

 
 

事务的特性

事务4个特性,简写未ACID

  • 原子性(Atomicity):

事务是数据库的逻辑工作单位,它对数据库的修改要么全部执行,要么全部不执行。

 
 

  • 一致性(Consistemcy):

事务前后,数据库的状态都满足所有的完整性约束。

 
 

  • 隔离性(Isolation):

并发执行的事务是隔离的,一个不影响一个。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。通过设置数据库的隔离级别,可以达到不同的隔离效果。

 
 

  • 持久性(Durability):

在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

 
 

并行事务的问题

并行事务可能造成以下问题

Dirty Read【脏读】:

脏读又称无效数据读出。一个事务读取另外一个事务还没有提交的数据叫脏读。

 
 

例如:事务T1修改了一行数据,但是还没有提交,这时候事务T2读取了被事务T1修改后的数据,之后事务T1因为某种原因Rollback了,那么事务T2读取的数据就是脏的。

 
 

Nonrepeatable Read【不可重复读】:

不可重复读是指在同一个事务内,两个相同的查询返回了不同的结果。

 
 

例如:事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。

 
 

Phantom Read【幻读】:

事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者缺少了第一次查询中出现的数据

 
 

例如:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样。这就叫幻读。

 
 

备注:

不可重复读,在 update 语句时 可能发生

幻读,在 insert , delete 语句时 可能发生

 
 

事务隔离级别

标准SQL支持 4种 事务隔离级别

Transaction Isolation Levels

Isolation Level

Dirty Read 【脏读】

Nonrepeatable Read【不可重复读】

Phantom Read【幻读】

Read uncommitted 【未提交读】

Allowed, but not in PG

Possible

Possible

Read committed 【提交读】

Not possible

Possible

Possible

Repeatable read【可重复读】

Not possible

Not possible

Allowed, but not in PG

Serializable【串行化】

Not possible

Not possible

Not possible

 
 

Odoo事务隔离级别

odoo使用psycopg2 连接 postgreSQL进行数据库操作,并且自己实现了一个 connection pool,根据 config 指定的 db_maxconn 设置 连接池的 大小

 
 

在对Pg 进行连接的时候,默认使用 的事务隔离级别为 可重复读, 代码为

 
 

@check

def autocommit(self, on):

if on:

isolation_level = ISOLATION_LEVEL_AUTOCOMMIT

else:

# If a serializable cursor was requested, we

# use the appropriate PotsgreSQL isolation level

# that maps to snaphsot isolation.

# For all supported PostgreSQL versions (8.3-9.x),

# this is currently the ISOLATION_REPEATABLE_READ.

# See also the docstring of this class.

# NOTE: up to psycopg 2.4.2, repeatable read

# is remapped to serializable before being

# sent to the database, so it is in fact

# unavailable for use with pg 9.1.

isolation_level = \

ISOLATION_LEVEL_REPEATABLE_READ \

if self._serialized \

else ISOLATION_LEVEL_READ_COMMITTED

self._cnx.set_isolation_level(isolation_level)

 
 

可以看出 只要 connection 建立的时候, autocommit(False) 并且 self._serialized = True, 那么 事务隔离级别就是 ISOLATION_LEVEL_REPEATABLE_READ【可重复读】

 
 

实际上, psycopg2 在往 pg 传递事务 隔离级别时, 会根据 pg的版本进行 调整

当 pg_version < 8 时, 事务隔离级别会 提升

/* Promote an isolation level to one of the levels supported by the server */

if (self->server_version < 80000) {

if (isolevel == ISOLATION_LEVEL_READ_UNCOMMITTED) {

isolevel = ISOLATION_LEVEL_READ_COMMITTED;

}

else if (isolevel == ISOLATION_LEVEL_REPEATABLE_READ) {

isolevel = ISOLATION_LEVEL_SERIALIZABLE;

}

}

所以, 当 pg 版本 低于 8 时, odoo的事务级别实际上设置为了 Serializable【串行化】; 当 使用新版的 pg 时, odoo的事务隔离级别为 Repeatable read【可重复读】,这个事务隔离级别会发生 表行锁。对于并发并行同一行数据, 会造成"could not serialize access due to concurrent update" 错误。

 
 

odoo事务控制

尽管Odoo Model方法是内建事务的,但是在需要的时候,可以使用 savepoint 进行现场保护,然后,对事务进行控制, 回滚,或者 释放

 
 

在需要 记录还原点的时候 使用 cursor.savepoint() , 例如

 
 

Odoo 后端数据库postgreSQL事务级别的更多相关文章

  1. 4.事务提交过程,交易的基本概念,Oracle交易周期,保存点savepoint,数据库的隔离级别

     事务提交过程 事务 基本概念 概念:一个或者多个DML语言组成 特点:要么都成功.要么都失败 事务的隔离性:多个client同一时候操作数据库的时候.要隔离它们的操作, 否则出现:脏读  不可反 ...

  2. 数据库并发事务控制四:postgresql数据库的锁机制二:表锁 <转>

    在博文<数据库并发事务控制四:postgresql数据库的锁机制 > http://blog.csdn.net/beiigang/article/details/43302947 中后面提 ...

  3. MySQL/MariaDB数据库的事务和隔离级别

      MySQL/MariaDB数据库的事务和隔离级别 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.事务概述 1>.事务Transactions 一组原子性的SQL语句 ...

  4. postgresql事务

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

  5. 为Informix数据库开启事务

    1.首先在Informix数据库安装根目录的etc文件夹下找到名为ONCONFIG.on_xxxx的配置文件: 2.打开ONCONFIG.on_xxxx文件,在第409行的位置找到TAPEDEV \\ ...

  6. hibernate(九) 二级缓存和事务级别详讲

    序言 这算是hibernate的最后一篇文章了,下一系列会讲解Struts2的东西,然后说完Struts2,在到Spring,然后在写一个SSH如何整合的案例.之后就会在去讲SSM,在之后我自己的个人 ...

  7. MySQL数据库的事务管理

    当前在开发ERP系统,使用到的数据库为Mysql.下面介绍下如何开启事务,以及事务隔离的机制 : 1. 检查当前数据库使用的存储引擎. show engines; 2. 修改前my.ini中的文件如下 ...

  8. [原创]java WEB学习笔记78:Hibernate学习之路---session概述,session缓存(hibernate 一级缓存),数据库的隔离级别,在 MySql 中设置隔离级别,在 Hibernate 中设置隔离级别

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  9. Azure SQL 数据库:服务级别与性能问答

    ShawnBice    2014 年 5 月 5 日上午 10:00 几天前,我发表了一篇文章,并就 4 月 24 日发布的适用于Windows Azure SQL 数据库的新服务级别提供了一些预料 ...

随机推荐

  1. COMPANY_点取消会卡死的解决方法

    // OLD void ctonedlg::onbtn_basedir_clicked() {     m_basedir = getUserSelectDir();     doSearchDir( ...

  2. How to duplicate a UIButton in Objective C?

    http://stackoverflow.com/questions/1092875/how-to-duplicate-a-uibutton-in-objective-c 1down vote To ...

  3. 【原创】Talend ETL开发——基于joblet的统一的email发送

    更新 2019/1/16:增加了允许5个附件发送.smtp等配置的字段. 一.背景 在ETL数据整合过程中,肯定会涉及到email的通知,比如ETL的执行情况汇报,执行耗时汇报,关键数据更新情况等信息 ...

  4. Ubuntu下触控板手势调节软件xSwipe

    楼主进了一台Thinkpad T450s,触控板支持4点触控,安装了ubuntu14.04 LTS之后,触控板只剩下双指滑动了,略有不爽,各种google,百度. 真找到办法了. 首先得知了touch ...

  5. luogu P1446 [HNOI2008]Cards

    题目链接 luogu P1446 [HNOI2008]Cards 题解 题意就是求染色方案->等价类 洗牌方式构成成了一个置换群 然而,染色数限制不能用polay定理直接求解 考虑burnsid ...

  6. [xsy2213]tower

    题意:给一个地图,地图上的每个位置是空地或一个炮或一些敌人,给定每个炮的方向(上/下/左/右),每个炮只能打一个位置且炮弹轨迹不能相交,问最多打到多少敌人 原题貌似是TC SRM 627的题,题解在这 ...

  7. 【bzoj1485:】【 [HNOI2009]有趣的数列】模任意数的卡特兰数

    (上不了p站我要死了,侵权度娘背锅) Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇 ...

  8. 八. 输入输出(IO)操作3.面向字符的输出流

    面向字符的输出流都是类 Writer 的子类,其类层次结构如图 10-5 所示. 图10-5 Writer的类层次结构图 表 10-3 列出了 Writer 的主要子类及说明. 表 10-3 Writ ...

  9. 2,搭建一个java开发环境

    (1)java开发需要的条件? 1)适用于环境开发的jdk(里面包括了jre和加热里面包括了jvm) 2)对应开发环境的eclipse 3)如果涉及到web开发,还需要web服务器(Tomcat) ( ...

  10. CRC(16位)多项式为 X16+X15+X2+1

    其对应校验二进制位列为1 1000 0000 0000 0101,可这有17位啊,我怎么和16位信息进行异或啊?是不是不要最高位的1 你没有弄明白crc的意思.这17位后面再添上16个零,然后开始抑或 ...