python事物管理及同步锁
我们经常会遇到这样子的问题,我给朋友赚钱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事物管理及同步锁的更多相关文章
- python 多线程中的同步锁 Lock Rlock Semaphore Event Conditio
摘要:在使用多线程的应用下,如何保证线程安全,以及线程之间的同步,或者访问共享变量等问题是十分棘手的问题,也是使用多线程下面临的问题,如果处理不好,会带来较严重的后果,使用python多线程中提供Lo ...
- 扯扯python的多线程的同步锁 Lock RLock Semaphore Event Condition
我想大家都知道python的gil限制,记得刚玩python那会,知道了有pypy和Cpython这样的解释器,当时听说是很猛,也就意味肯定是突破了gil的限制,最后经过多方面测试才知道,还是那德行… ...
- python 守护进程、同步锁、信号量、事件、进程通信Queue
一.守护进程 1.主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes ...
- Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures
参考博客: https://www.cnblogs.com/xiao987334176/p/9046028.html 线程简述 什么是线程?线程是cpu调度的最小单位进程是资源分配的最小单位 进程和线 ...
- python 全栈开发,Day42(Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures)
昨日内容回顾 线程什么是线程?线程是cpu调度的最小单位进程是资源分配的最小单位 进程和线程是什么关系? 线程是在进程中的 一个执行单位 多进程 本质上开启的这个进程里就有一个线程 多线程 单纯的在当 ...
- Python并发编程-进程 线程 同步锁 线程死锁和递归锁
进程是最小的资源单位,线程是最小的执行单位 一.进程 进程:就是一个程序在一个数据集上的一次动态执行过程. 进程由三部分组成: 1.程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成 2.数据 ...
- python笔记9 线程进程 threading多线程模块 GIL锁 multiprocessing多进程模块 同步锁Lock 队列queue IO模型
线程与进程 进程 进程就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成.我们编写的程序用来描述进程要完成哪些功能以及如何完成:数据集则是程序在执行过程中所需要 ...
- python全栈开发,Day42(Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures)
昨日内容回顾 线程 什么是线程? 线程是cpu调度的最小单位 进程是资源分配的最小单位 进程和线程是什么关系? 线程是在进程中的一个执行单位 多进程 本质上开启的这个进程里就有一个线程 多线程 单纯的 ...
- python并发编程之多进程(二):互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型
一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...
随机推荐
- 2019年Web前端最新导航(常见前端框架、前端大牛)
本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 前言 本文列出了很多与前端有关的常见网站.博客.工具等,整体来看比较权威.有些东西已经 ...
- vue2 学习笔记2
文中例子代码请参考github 品牌管理案例 添加新品牌 <body> <div id="app"> <div class="panel p ...
- SpringBoot实现热部署(修改class不需要重启)
热部署: devtools可以实现页面热部署(即页面修改后会立即生效, 这个可以直接在application.properties文件中配置spring.thymeleaf.cache=false来实 ...
- vue 之 .sync 修饰符
在一些情况下,我们可能会需要对一个 prop (父子组件传递数据的属性) 进行“双向绑定”. 在vue 1.x 中的 .sync 修饰符所提供的功能.当一个子组件改变了一个带 .sync 的prop的 ...
- C语言 实现逆置功能
C语言 实现逆置功能 //凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. 字符串的逆置 方法1:利用数组 #include<stdio.h> ...
- JAVA 容易忽略的东西
Java中的取余会出现负数.用Math.floorMod()方法可以掰正,但是也仅限被除数是负数的情况,如果除数是负数,这个没用. 和C不一样,Java中的字符串是不可变字符串,不能修改Java字符串 ...
- SpringCloud之初识Zuul(网关)---动态路由,权限验证
通过前面的学习,使用Spring Cloud实现微服务的架构基本成型,大致是这样的: 我们使用Spring Cloud Netflix中的Eureka实现了服务注册中心以及服务注册与发现:而服务间通过 ...
- 【Linux基础】VI命令模式下删除拷贝与粘贴
在VI命令模式下:y 表示拷贝, d 表示删除,p标识粘贴 1.删除 dw 表示删除从当前光标到光标所在单词结尾的内容. d0 表示删除从当前光标到光标所在行首的内容. d$ 表示删除从当前光标到光标 ...
- Teradata的DBQL使用
1.赋权 grant exec on DBC.DBQLAccessMacro to Sysdba with grant option; 2.刷新DBQL或TDWM缓存到磁盘,立即能在数据库中查询到刚刚 ...
- 数位dp D - Count The Bits
题目:D - Count The Bits 博客 #include <cstdio> #include <cstring> #include <cstdlib> # ...