我们经常会遇到这样子的问题,我给朋友赚钱100,分为两步:

  1)我的账户-100

  2)朋友账户 +100

看似需求很简单,但是如果在上面的步骤1)结束后,系统崩溃了怎么办?

数据库中有事物管理,也就是对于一系列的数据库操作,要么全部成功,要不全部失败,这样就保证了数据的一致性。这就是事务管理的原子性。

以mysql的innodb的事务管理为例,事务管理执行过程如下:

  1)开启事务管理:start transaction

  2)回退操作:rollback,回退到开启事物管理之前,如果在事务管理中设置了savepoint saveplace,执行rollback to saveplace的时候,会会退到设置savepoint之前。

  3)事物提交:commit。将数据结果永久写入数据库中,没办法再执行rollback回退了。

如果出现上面说的异常情况,我们就需要用到数据库的事务管理。

如下图:

  我们正常的向数据库插入两条数据:

  执行后,会在数据库中多出两条数据,

  

现在我们将这两条执行语句改一改,将下面一条执行语句改错,在看执行结果:

  

这时候,我们查看数据库,发现上面一条数据被正常执行并插入数据库了

  

很明显,上面这个情况,不是我们希望看到的,我们希望的是,在第二条执行语句报错的情况下,我们整个执行数据库的事物都不执行。

我们再将代码修改一下,加上python里面的事务管理 :

  from django.db import transaction

  

我们再去查看数据库,就会发现,数据库没有数据,这就达到我们的需求了。

上面这种情况是在单线程下的示例,是没有问题的,但是如果是多线程时,会出现下面这种情况:

  A给B转账100, 这是,程序会先读取B账户,给B账户加100,这个过程中,C也给B转账100,新线程也会操作B账户,给B账户加100,在A转账完成后,发现实际上B的账户只增加了100元。

  这种情况下,为了保证数据的一致性,我们需要引入线程的隔离性,即保证每个线程看到的数据是一致的。这个需要借助【锁】来实现。

  处理这种情况,我们可以用【同步锁】:

  如下,我们创建五个线程同时去操作一个同账户,每次给该账户增加100元,按照我们的预期,最后结果应该是600,但是,从下面的打印,我们可以看出来,最终的结果是300,并不是我们要的600.

  这就是上面说的多线程情况下的数据不一致问题。

          

  下面,我们将代码修改一下:

  

  上面的代码中,我们就加入了同步锁,threading.Lock()

  在数据可能会被同时修改的地方,加上l.accquire() 获得同步锁,然后在资源操作完成后,再将锁释放掉l.release(),给下一个线程使用,这样就避免了数据同时被多个线程修改的问题。

python事物管理及同步锁的更多相关文章

  1. python 多线程中的同步锁 Lock Rlock Semaphore Event Conditio

    摘要:在使用多线程的应用下,如何保证线程安全,以及线程之间的同步,或者访问共享变量等问题是十分棘手的问题,也是使用多线程下面临的问题,如果处理不好,会带来较严重的后果,使用python多线程中提供Lo ...

  2. 扯扯python的多线程的同步锁 Lock RLock Semaphore Event Condition

    我想大家都知道python的gil限制,记得刚玩python那会,知道了有pypy和Cpython这样的解释器,当时听说是很猛,也就意味肯定是突破了gil的限制,最后经过多方面测试才知道,还是那德行… ...

  3. python 守护进程、同步锁、信号量、事件、进程通信Queue

    一.守护进程 1.主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes ...

  4. Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures

    参考博客: https://www.cnblogs.com/xiao987334176/p/9046028.html 线程简述 什么是线程?线程是cpu调度的最小单位进程是资源分配的最小单位 进程和线 ...

  5. python 全栈开发,Day42(Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures)

    昨日内容回顾 线程什么是线程?线程是cpu调度的最小单位进程是资源分配的最小单位 进程和线程是什么关系? 线程是在进程中的 一个执行单位 多进程 本质上开启的这个进程里就有一个线程 多线程 单纯的在当 ...

  6. Python并发编程-进程 线程 同步锁 线程死锁和递归锁

    进程是最小的资源单位,线程是最小的执行单位 一.进程 进程:就是一个程序在一个数据集上的一次动态执行过程. 进程由三部分组成: 1.程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成 2.数据 ...

  7. python笔记9 线程进程 threading多线程模块 GIL锁 multiprocessing多进程模块 同步锁Lock 队列queue IO模型

    线程与进程 进程 进程就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成.我们编写的程序用来描述进程要完成哪些功能以及如何完成:数据集则是程序在执行过程中所需要 ...

  8. python全栈开发,Day42(Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures)

    昨日内容回顾 线程 什么是线程? 线程是cpu调度的最小单位 进程是资源分配的最小单位 进程和线程是什么关系? 线程是在进程中的一个执行单位 多进程 本质上开启的这个进程里就有一个线程 多线程 单纯的 ...

  9. python并发编程之多进程(二):互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型

    一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...

随机推荐

  1. windows下安装mysql

    windows 下安装mysql 1.先下载好 mysql5.7 版本的安装包,可以去官网自己下载,也可以从我的百度云分享 里面下载: 链接: https://pan.baidu.com/s/1VXk ...

  2. Pyqt5+python+ErIC6+QT designer

    Eric6安装及配置 https://blog.csdn.net/weixin_41656968/article/details/80253012 Python3.6+PyQt5+Eric6.0环境配 ...

  3. 【PAT】B1004 成绩排名

    简单题 循环输入放入结构体数组,一个sort搞定 #include <stdio.h> #include<algorithm> using namespace std; str ...

  4. sqli-labs第一节 get-字符型注入

    https://blog.csdn.net/sherlock17/article/details/64454449   1.SQL注入漏洞的几种判断方法 ①http://www.heetian.com ...

  5. 第六章 第一个Linux驱动程序: 统计单词个数

    一.编写Linux驱动程序的步骤 第1 步:建立Linux 驱动骨架(装载和卸载Linux 驱动) 骨架部分主要是Linux驱动的初始化和退出函数,代码如下: #include <linux/m ...

  6. LeetCode算法题-Balanced Binary Tree(Java实现)

    这是悦乐书的第167次更新,第169篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第26题(顺位题号是110).给定二叉树,判断它是否是高度平衡的.对于此问题,高度平衡二 ...

  7. vue v-nav指令属性列表

    v-nav指令属性列表 属性名 属性描述 类型 必选 默认 title 导航栏标题 String No 空字符串 showBackButton 是否显示(左边的)返回按钮 Boolean No fal ...

  8. Java多线程 Socket使用

    点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更新中~ 正式篇: Java多线程(一) 什么是线程 Java多线程(二)关于多线程的CPU密集型和IO密集型这件事 Java多线程(三)如何 ...

  9. pip命令安装 pyinstaller失败解决办法

    写在前面,如果是用win10系统的用户,一定要先通过管理员模式打开命令窗口,我是直接按 win + x 键,选择 "Windows Powershell(管理员)",否则会提示:  ...

  10. WPF触发器(非数据库中的触发器)

    一.什么是触发器?触发器(Trigger)就是当某种条件满足后即完成相应逻辑功能的一部分程序组成.在当前的WPF中,Trigger一共有三种类型,它们分别是: (1)属性触发器:其对应的类是Trigg ...