实例讲解MySQL中乐观锁和悲观锁
作者:laozhang 发布时间:2024-01-19 00:46:35
数据库管理系统中并发控制的任务是确保在多个事务同时存取数据库中同一数据不破坏事务的隔离性和统一性以及数据库的统一性
乐观锁和悲观锁式并发控制主要采用的技术手段
悲观锁
在关系数据库管理系统中,悲观并发控制(悲观锁,PCC)是一种并发控制的方法。它可以阻止一个事务以影响其他用户的方式来修改数据。如果一个事务执行的操作的每行数据应用了锁,那只有当这个事务锁释放,其他事务才能够执行与该锁冲突的操作
悲观并发控制主要应用于数据争用激烈的环境,以及发生并发冲突时使用锁保护数据的成本要低于回滚事务的成本环境
悲观锁,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度(悲观),因此在整个暑假处理过程中,将数据处于锁定状态。悲观锁的实现,一般依靠数据库提供的锁机制(推荐教程:MySQL教程)
数据库中,悲观锁的流程如下
在对任何记录进行修改之前,先尝试为该记录加上排他锁
如果加锁失败,说明该记录正在被修改,那么当前查询可能要等待或抛出异常
如果成功加锁,则就可以对记录做修改,事务完成后就会解锁
其间如果有其他对该记录做修改或加排他锁的操作,都会等待我们解锁或直接抛出异常
MySQL InnoDB中使用悲观锁
要使用悲观锁,必须关闭mysql数据库的自动提交属性,因为MySQL默认使用autocommit模式,也就是当你执行一个更新操作后,MySQL会立即将结果进行提交
//开始事务
begin;/begin work;/start transaction;(三者选一个)
select status from t_goods where id=1 for update;
//根据商品信息生成订单
insert into t_orders (id,goods_id) values (null,1);
//修改商品status为2
update t_goods set status=2;
// 提交事务
commit;/commit work;
以上查询语句中,使用了select...for update方式,通过开启排他锁的方式实现了悲观锁。则相应的记录被锁定,其他事务必须等本次事务提交之后才能够执行
我们使用select ... for update会把数据给锁定,不过我们需要注意一些锁的级别,MySQL InnoDB默认行级锁。行级锁都是基于索引的,如果一条SQL用不到索引是不会使用行级锁的,会使用表级锁把整张表锁住。
特点
为数据处理的安全提供了保证
效率上,由于处理加锁的机制会让数据库产生额外开销,增加产生死锁机会
在只读型事务中由于不会产生冲突,也没必要使用锁,这样会增加系统负载,降低并行性
乐观锁
乐观并发控制也是一种并发控制的方法。
假设多用户并发的事务在处理时不会彼此互相影响,各事务能够在不产生锁的情况下处理各自影响的那部分数据,在提交数据更新之前,每个事务会先检查在该事务读取数据后,有没其他事务修改该数据,如果有则回滚正在提交的事务
乐观锁相对悲观锁而言,是假设数据不会发生冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误信息,让用户决定如何做
乐观锁实现一般使用记录版本号,为数据增加一个版本标识,当更新数据的时候对版本标识进行更新
实现
使用版本号时,可以在数据初始化时指定一个版本号,每次对数据的更新操作都对版本号执行+1操作。并判断当前版本号是不是该数据的最新版本号
1.查询出商品信息
select (status,status,version) from t_goods where id=#{id}
2.根据商品信息生成订单
3.修改商品status为2
update t_goods
set status=2,version=version+1
where id=#{id} and version=#{version};
特点
乐观并发控制相信事务之间的数据竞争概率是较小的,因此尽可能直接做下去,直到提交的时候才去锁定,所以不会产生任何锁和死锁
猜你喜欢
- 环境:pyecharts库,echarts-countries-pypkg,echarts-china-provinces-pypkg,ec
- 本文主要研究的是Python编程turtle的实例,绘制一个七彩蟒蛇。。具体如下。第2周的课后练习里,有一道题目,要求修改“蟒蛇绘制”程序,
- 请教:如何在现存的文档中动态嵌入一段JS?如果是一段CSS呢?创建一个<script></script>并在scri
- 如下所示:# -*- coding: utf-8 -*-import sys, urllib, urllib2, jsoncity=urll
- php获取文件创建时间、修改时间常用代码filemtime ( string filename )返回文件上次被修改的时间,出错时返回 FA
- 说起 Python 强大的地方,你可能想到是它的优雅、简洁、开发速度快,社区活跃度高。但真正使得这门语言经久不衰的一个重要原因是它的无所不能
- 本文实例讲述了Python中dictionary items()系列函数的用法,对Python程序设计有很好的参考借鉴价值。具体分析如下:先
- mysql数据库数据表和数据表关联--问题??用户数据表user 字词作品数据表article 短信 message外键ID 主键,之间的关
- { hide_text } CSS文字隐藏总结报告最近整理的一份CSS文字隐藏的demo,总结了几种方法,希望得出一种最完美的方案放进自己的
- 从python2.4版本开始,可以用subprocess这个模块来产生子进程,并连接到子进程的标准输入/输出/错误中去,还可以得到子进程的返
- 1、目前来看,百付宝仅仅只是C2C的一个支付后台。他的内容只集中于“钱和订单”两个环节,没有其他干扰信息。2、百付宝的界面表现很简单。因为简
- 问题描述:30 个人在一条船上,超载,需要 15 人下船。于是人们排成一队,排队的位置即为他们的编号。报数,从 1 开始,数到 9 的人下船
- 在1943年,沃伦麦卡洛可与沃尔特皮茨提出了第一个脑神经元的抽象模型,简称麦卡洛可-皮茨神经元(McCullock-Pitts neuron
- 1. 换源地址# 中科大deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-
- 一、查看可用字体import pygameprint(pygame.font.get_fonts())二、设置字体1.使用系统字体self.
- 一般情况下TextArea区输入的文字数量是没有限制的,但是我们可以通过javascript限制表单的文字字数。如下javascript代码
- PyCharm IDE 窗口布局PyCharm 调试代码实例(这里我以自己的代码为例)__author__ =&nbs
- pytorch和numpy默认浮点类型位数numpy中默认浮点类型为64位,pytorch中默认浮点类型位32位测试代码如下numpy版本:
- 内容介绍将日常工作中遇到的数数据冲突和样本源的方法进行总结,其中主要包括实际业务数据冲突、样本选取问题、数据共线性 等思路,并且长期更新。实
- 前言看到一个很有意思的项目,其实在之前就在百度飞浆等平台上看到类似的实现效果。可以将照片按照视频的表情,动起来。看一下项目给出的效果。项目地