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. 阿里的iptables,保存一份

    # Generated by iptables-save v1.4.7 on Fri Apr 14 16:37:31 2017 *filter :INPUT ACCEPT [0:0] :FORWARD ...

  2. 代码编辑器[0] -> Vim/gVim[0] -> 基于 Python 的 gVim 环境配置(Windows)

     环境配置 / Environment Setup 基于Python开发的 gVim 环境配置(Windows) 使用方式参考 Vim 的使用. 1 基于vundle进行配置 Vim有多个扩展管理器, ...

  3. 树链剖分【p3178】[HAOI2015]树上操作

    Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a .操作 2 :把某个节点 x 为根的子树中所有点 ...

  4. 分层图【p4822】[BJWC2012]冻结

    Description "我要成为魔法少女!" "那么,以灵魂为代价,你希望得到什么?" "我要将有关魔法和奇迹的一切,封印于卡片之中„„" ...

  5. 数学【p1658】 购物

    题目描述 你就要去购物了,现在你手上有N种不同面值的硬币,每种硬币有无限多个.为了方便购物,你希望带尽量少的硬币,但要能组合出1到X之间的任意值. 分析: 看到题解做法没有说出原理,所以尝试解释一下. ...

  6. 如何正确使用const(常量),define(宏)

    前言 在开发中,也许我们会经常使用到宏定义,或者用const修饰一些数据类型,经常有开发者不知道怎么正确使用,导致项目中乱用宏定义与const修饰符.本篇主要介绍在开发中怎么正确使用const与def ...

  7. hdu 4826 Labyrinth DP

    题目链接:HDU - 4826 度度熊是一只喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫只能从矩阵左上角第一个方格开始走,只有走到右上角的第一个格子才算走出迷宫,每一次只能走一格,且只能向 ...

  8. uprobes issue with oracle 12c

    https://mahmoudhatem.wordpress.com/2017/03/21/uprobes-issue-with-oracle-12c/

  9. squid.conf 的cache_peer 详解

    通过squid.conf配置文件中的cache_peer选项来配置代理服务器阵列,通过其他的选项来控制选择代理伙伴的方法.Cache_peer的使用格式如下: cache_peer hostname ...

  10. 工具分享:GitHub的克隆工具Cl0neMast3r,轻松搞定各种测试

    GitHub,相信大家并不陌生,咱搞技术的应该都会用到它,GitHub主要是进行代码工具的存储.下载等工作.今天介绍一款让我们操作GitHub相关工作变的更简单的工具, GitHub的克隆工具. Cl ...