事务、并发、锁机制的实现

 配置全局事务


DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'mydb','USER':'root','PASSWORD':'pass','HOST':'127.0.0.1','PORT':3306,'ATOMIC_REQUESTS': True,  # 全局开启事务,绑定的是http请求响应整个过程# (non_atomic_requests可局部实现不让事务控制)}
}

配置全局事务中局部不受事务控制

# 1.不受全局事务控制
# 如有多个数据库,让使用db的视图不受事务控制
@transaction.non_atomic_requests(using='db')
def my_other_view(request):pass

回滚点配置保存及提交

sid = transaction.savepoint()  # 回滚点
with transaction.atomic():try:passexcept Exception as e:# 如发生异常,回滚到指定地方。transaction.savepoint_rollback(sid)# 如果没有异常,显式地提交一次事务transaction.savepoint_commit(sid)

悲观锁的实现

# django实现悲观锁
@transaction.atomic
def post(self, request):# select_for_update表示锁,只有获取到锁才会执行查询,否则阻塞等待。xxx.objects.select_for_update().get(id=1)# 等事务提交后,会自动释放锁。# 同时使用select_for_update与select_related
# 只会锁定entry(self)和category,不会锁定作者author
xxx.objects.select_related('author', 'category').select_for_update(of=('self', 'category'))
# 注意:MySQL版本要在8.0.1 以上才支持 nowait,skip_locked和of选项。

乐观锁的实现

# 乐观锁实现
@transaction.atomic
def post(self, request):goods_id = request.GET.get('id')count = int(request.GET.get('count'))while True:# 查询商品对象 -- 最基本查询goods = xxx.objects.filter(id=goods_id).first()origin_stock = goods.stock  # 获取原始库存,会检查是否有变化,乐观锁的特点sleep(5)# 减少商品的库存数量,保存到数据库xxx.objects.filter(id=goods_id, stock=origin_stock).update(stock=origin_stock - count)

mysql 的主从搭建的原因:

        1.实现读写分离,多个msyql可实现提高并发量

        2.主库写数据,从库读数据

docker pull mysql:5.7

 创建文件夹,配置mysql1主,mysql2从数据库

mkdir /root/mysql1
mkdir /root/mysql1/conf.d
mkdir /root/mysql2/data/
touch /root/mysql2/my.cnf
 
mkdir /root/mysql2
mkdir /root/mysql2/conf.d
mkdir /root/mysql2/data/
touch /root/mysql2/my.cnf

配置主从数据库

主:/root/mysql1/my.cnf

主
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000
server-id=100                   # id
log-bin=mysql-bin               # bin
[client]
default-character-set=utf8[mysql]
default-character-set=utf8

从:/root/mysql2/my.cnf

[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000
server-id=101                  # id
log-bin=mysql-slave-bin         # bin
relay_log=edu-mysql-relay-bin [client]
default-character-set=utf8[mysql]
default-character-set=utf8

启动mysql,设置端口和目录的映射

主库容器设置

docker run  -di -v /root/mysql1/data/:/var/lib/mysql -v /root/mysql1/conf.d:/etc/mysql/conf.d -v /root/mysql1/my.cnf:/etc/mysql/my.cnf -p 33307:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

 从库容器设置

docker run  -di -v /root/mysql2/data/:/var/lib/mysql -v /root/mysql2/conf.d:/etc/mysql/conf.d -v /root/mysql2/my.cnf:/etc/mysql/my.cnf -p 33306:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

 docker  ps   可查看运行的mysql容器

 连接主库

mysql -uroot -P33307 -h 10.0.0.200 -p123456
再主库创建用户并授予所以权限
## 创建用户test
create user 'test'@'%' identified by '123';
## 授权
grant all privileges on *.* to 'test'@'%' ;
## 刷新权限
flush privileges;
# 查看主状态
show master status;

 连接从数据库

change master to master_host='10.0.0.200',master_port=33307,master_user='test',master_password='123',master_log_file='mysql-bin.000003',master_log_pos=0;

 命令详细解释

  •  change master to
  • master_host='MySQL主服务器IP地址',
  • master_user='之前在MySQL主服务器上面创建的用户名',
  • master_password='之前创建的密码',
  • master_log_file='MySQL主服务器状态中的二进制文件名',
  • master_log_pos='MySQL主服务器状态中的position值';

 这时在主数据库中写入数据,可在从数据库中查看;

注若测试在从数据库中写入数据会导致主从冲突,造成主从断开

可以通过下发如下命令解决

stop slave;  # 先停止主从库
set GLOBAL SQL_SLAVE_SKIP_COUNTER=2; # 这里是跳过binlog的命令条数
start slave;  # 启动主从就ok了

 django的多数据的读写分离

DATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3','NAME': BASE_DIR / 'db.sqlite3',},'db1': {'ENGINE': 'django.db.backends.sqlite3','NAME': BASE_DIR / 'db1.sqlite3',}
}

migrate --database db1 app01    # 迁移指定数据库

  手动测试读写分离:

Book.objects.using('db1').create(name='xxx')

   自动测试读写分离:

class DBRouter(object):
    def db_for_read(self, model, **hints):
        # 多个从库 ['db1','db2','db3']
        # model是哪个模型表
        return 'db1'
 
    def db_for_write(self, model, **hints):
 
 
        return 'default'

 DATABASE_ROUTERS = ['utils.db_router.DBRouter', ]  # 配置setting

 借鉴博客:https://www.cnblogs.com/clever-cat/p/17356820.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/752202.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

stable diffusion webui 搭建和初步使用

官方repo: GitHub - AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UI 关于stable-diffusion的介绍:Stable Diffusion|图解稳定扩散原理 - 知乎 一、环境搭建和启动 准备在容器里面搞一下 以 ubuntu22.04 为基础镜像,新建…

UnityShader(十六)凹凸映射

前言: 纹理的一种常见应用就是凹凸映射(bump mapping)。凹凸映射目的就是用一张纹理图来修改模型表面的法线,让模型看起来更加细节,这种方法不会改变模型原本的顶点位置(也就是不会修改模型的形状&#xf…

数据结构之顺序存储-顺序表的基本操作c/c++(创建、初始化、赋值、插入、删除、查询、替换、输出)

学习参考博文&#xff1a;http://t.csdnimg.cn/Qi8DD 学习总结&#xff0c;同时更正原博主在顺序表中插入元素的错误。 数据结构顺序表——基本代码实现&#xff08;使用工具&#xff1a;VS2022&#xff09;&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include <stdi…

uniapp canvas文字和元素居中

文字居中&#xff1a;ctx.textAlign "center"; 元素居中&#xff1a;ctx.arc(screenWidth / 2, 122, 40, 0, 2 * Math.PI); ctx.arc()的x轴为当前屏幕的宽度/2&#xff1b; let screenWidth 540; let screenHeight 960; // 头像 if (photoimg) {ctx.setFillSty…

gitlab cicd问题整理

1、docker设置数据目录&#xff1a; 原数据目录磁盘空间不足&#xff0c;需要更换目录&#xff1a; /etc/docker/daemon.json //写入/etc/docker/daemon.json {"data-root": "/data/docker" } 2、Dockerfile中ADD指令不生效 因为要ADD的文件被.docker…

指南:在各主流操作系统上安装与配置Apache Tomcat

指南&#xff1a;在各主流操作系统上安装与配置Apache Tomcat Apache Tomcat作为一款广受欢迎的开源Java Servlet容器&#xff0c;为用户提供了一个纯Java环境下的Web服务器和Servlet容器。本文将详细介绍如何在不同的操作系统上安装Apache Tomcat&#xff0c;并进行基本的配置…

【计算机网络】什么是http?

​ 目录 前言 1. 什么是HTTP协议&#xff1f; 2. 为什么使用HTTP协议&#xff1f; 3. HTTP协议通信过程 4. 什么是url&#xff1f; 5. HTTP报文 5.1 请求报文 5.2 响应报文 6. HTTP请求方式 7. HTTP头部字段 8. HTTP状态码 9. 连接管理 长连接与短连接 管线化连接…

smartmontools-5.43交叉编译Smartctl

嵌入式系统的sata盘经常故障&#xff0c;需要使用smatctl工具监控和诊断sata故障。 1. 从网上下载开源smartmontools-5.43包。 2. 修改makefile进行交叉编译。 由于软件包中已经包含Makefile.am&#xff0c;Makefile.in。直接运行 automake --add-missing 生成Makefile。 3.…

自动部署SSL证书到阿里云腾讯云CDN

项目地址&#xff1a;https://github.com/yxzlwz/ssl_update 项目简介 目前&#xff0c;自动申请和管理免费SSL证书的项目有很多&#xff0c;如个人正在使用的 acme.sh。然而在申请后&#xff0c;如果我们的需求不仅限于服务器本地的使用&#xff0c;证书的部署也是一件麻烦事…

Gin 框架中实现路由的几种方式介绍

本文将为您详细讲解 Gin 框架中实现路由的几种方式&#xff0c;并给出相应的简单例子。Gin 是一个高性能的 Web 框架&#xff0c;用于构建后端服务。在 Web 应用程序中&#xff0c;路由是一种将客户端请求映射到特定处理程序的方法。以下是几种常见的路由实现方式&#xff1a; …

JavaScript | 检测文档在垂直方向已滚动的像素值用pageYOffset在webstorm上显示弃用了,是否应该继续使用?还是用其他替代?

在学习JavaScript的时候&#xff0c;深入学习时会遇到一些实际案例需要检测文档在垂直方向已滚动的像素值。 例如&#xff0c;当前页面内容很多&#xff0c;我想要滚动鼠标滑轮或者拖拽滚动条来浏览网页下面的内容。这时候一动滚动条&#xff0c;一些绝对固定的盒子却想要随着…

python图形化编程turtle小乌龟

文章目录&#xff1a; 一&#xff1a;导入包&#xff08;常用的&#xff09; 二&#xff1a;布局 1.设置世界坐标系 2.窗体 3.画布屏幕screen 三&#xff1a;线条画笔海龟 1.运动 2.样式 3.外观 4.其他 四&#xff1a;颜色 五&#xff1a;文字 六&#xff1a;图…

【Kubernetes】k8s删除master节点后重新加入集群

目录 前言一、思路二、实战1.安装etcdctl指令2.重置旧节点的k8s3.旧节点的的 etcd 从 etcd 集群删除4.在 master03 上&#xff0c;创建存放证书目录5.把其他控制节点的证书拷贝到 master01 上6.把 master03 加入到集群7.验证 master03 是否加入到 k8s 集群&#xff0c;检查业务…

Unity触发器的使用

1.首先建立两个静态精灵&#xff08;并给其中一个物体添加"jj"标签&#xff09; 2.添加触发器 3.给其中一个物体添加刚体组件&#xff08;如果这里是静态的碰撞的时候将不会触发效果&#xff0c;如果另一个物体有刚体可以将它移除&#xff0c;或者将它的刚体属性设置…

c++pair的用法

pair简单来说就是可以存储两种类型数据的一个类&#xff0c;其内部是使用模板实现的&#xff0c;所以可以指定其内部的类型。 pair在#include <utility> pair的构造 pair<int, string> p1({ 1,"张三" });pair<int, string> p2;pair<int, str…

文件的基础

一、文件 什么是文件 文件流&#xff1a; 一、1、文件的相关操作 创建文件的三种方式&#xff1a; public class FileCreate {public static void main(String[] args) {}//方式1 new File(String pathname)Testpublic void create01() {String filePath "e:\\news1.…

Qt源码分析: QEventLoop实现原理

QEventLoop屏蔽了底层消息循环实现细节&#xff0c;向上提供了与平台无关的消息/事件循环。 本文拟对Windows系统下QEventLoop的实现原理予以分析。 注1&#xff1a;限于研究水平&#xff0c;分析难免不当&#xff0c;欢迎批评指正。 注2&#xff1a;文章内容会不定期更新。 …

C语言-memcpy(不重复地址拷贝 模拟实现)

memcpy&#xff08;不重复地址拷贝&#xff09; 语法格式 在C语言中&#xff0c;memcpy 是一个标准库函数&#xff0c;用于在内存之间复制数据。它的原型定义在 <string.h> 头文件中。memcpy 的语法格式如下&#xff1a; c void *memcpy(void *destination, const voi…

健身·健康行业Web3新尝试:MATCHI

随着区块链技术进入主流&#xff0c;web3 运动已经开始彻底改变互联网&#xff0c;改写从游戏到金融再到艺术的行业规则。现在&#xff0c;MATCHI的使命是颠覆健身行业。 MATCHI是全球首个基于Web3的在线舞蹈健身游戏和全球首个Web3舞蹈游戏的发起者&#xff0c;注册于新加坡&a…

K8s 集群高可用master节点ETCD挂掉如何恢复?

写在前面 很常见的集群运维场景&#xff0c;整理分享博文内容为 K8s 集群高可用 master 节点故障如何恢复的过程理解不足小伙伴帮忙指正 不必太纠结于当下&#xff0c;也不必太忧虑未来&#xff0c;当你经历过一些事情的时候&#xff0c;眼前的风景已经和从前不一样了。——村上…