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. cygwin设置

    解决乱码问题 # 设置为中文环境,使提示成为中文  export LANG =" zh_CN.UTF-8 " # 输出为中文编码  export OUTPUT_CHARSET =& ...

  2. 【转】Hadoop安装教程_单机/伪分布式配置_Hadoop2.6.0/Ubuntu14.04

    原文链接:http://dblab.xmu.edu.cn/blog/install-hadoop/ 当开始着手实践 Hadoop 时,安装 Hadoop 往往会成为新手的一道门槛.尽管安装其实很简单, ...

  3. 【原创】SSIS-执行包任务调用子包且子包读取父包变量

    背景: 有时候需要将一个个开发好的独立的ETL包串接起来形成一个独立而庞大的包,如:每家分公司都开发不同的ETL包,最后使用执行包任务来将这些分公司的包给串联起来形成一个独立而完整运行的ETL包,此时 ...

  4. 最近看点JAVA

    这本的书名:<求精要决:JAVA EE编程开发安全精解> 请得很懂 试一下servlet代码: <!DOCTYPE html> <html> <head> ...

  5. vs code 在windows10 64bit系统配置python开发环境

    一.搭建 python 环境 在 VSC 中点击 F1 键,弹出控制台,输入 ext install 界面左侧弹出扩展窗格,输入python,确认,开始搜索下载发布者为Don Jayamanne 的 ...

  6. vi / vim 设置

    一.vi下方向键输入后,出现ABCD,解决方法: 在vi中输入:set nocp 按回车即可. 二.设置TAB缩进4个空格: 为了vim更好的支持python写代码,修改tab默认4个空格有两种设置方 ...

  7. Codeforces 208E - Blood Cousins(树上启发式合并)

    208E - Blood Cousins 题意 给出一棵家谱树,定义从 u 点向上走 k 步到达的节点为 u 的 k-ancestor.多次查询,给出 u k,问有多少个与 u 具有相同 k-ance ...

  8. 树链剖分【p4315】月下"毛景树"

    Description 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园. 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校园里. 爬啊爬~爬啊爬毛毛虫爬到了一颗小小的" ...

  9. 「CTSC2018」假面

    真~签到题qwq 昨天在考场上先写了个70分暴力dp,然后发现好像可以优化.因为结界技能的模型相当于要求出 对于每个物品,仅仅不选它的背包是什么....  于是当场脑补出两种做法: 前缀和后缀背包卷积 ...

  10. 第七章 android-UI组件

    一.本章目录 二.用户界面概述 1,用户界面简介 (1)系统和用户之间进行信息交换的媒介 2,设计手机用户界面应解决的问题 (1)需要界面设计和逻辑代码完全分离(布局和逻辑代码分开放) (2)根据不同 ...