php并发数据库操作,数据库的并发操作
? 数据库并发操带来的问题 数据的不一样,包括三类 2 丢失修改 当一个事务修改了数据,并且这种修改还没有还没有提交到数据库中时,另外一个事务又对同样的数据进 行了修改,并且把这种修改提交到了数据库中。这样,数据库中没有出现第一个事务修改数据的结
? 数据库并发操带来的问题
数据的不一样,包括三类
2 丢失修改
当一个事务修改了数据,并且这种修改还没有还没有提交到数据库中时,另外一个事务又对同样的数据进 行了修改,并且把这种修改提交到了数据库中。这样,数据库中没有出现第一个事务修改数据的结果,好像这种 数据修改丢失了一样。
2 脏读
当一个事务正在访问数据,并对数据进行了修改,而这种修改还没有提交到数据库中,这时,另一个事务 也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另一个事务读到的这个数据是 脏数据,依据脏数据所做的操作可能是不正确的。
2 不可重复读
在一个事务内,多次读同一数据。在这个事务还没有结束时,另一个事务也访问该同一数据,那么,在第 一个事务中的两次读数据之间,由于第二个事务的修改,第一个事务两次读到的数据可能是不一样的。
? 如何解决?
避免不一致性的方法和技术就是并发控制。最常用的并发控制技术是封锁技术。
2 并发控制原因
数据库是共享资源,通常有许多个事务同时在运行。
当多个事务并发地存取数据库时就会产生同时读取和 /或修改同一数据的情况。若对并发操作不加控制就可能会 存取和存储不正确的数据,破坏数据库的一致性。所以数据库管理系统必须提供并发控制机制。
解决方法
2 禁止数据出现不一致--封锁技术
l 何为封锁
封锁就是事务 T在对某个数据对象例如表、记录等操作之前,先向系统发出请求,对其加锁。加锁后事务T就 对该数据对象有了一定的控制,在事务T释放它的锁之前,其他的事务不能更新此数据对象。封锁是实现并发控 制 的一个非常重要的技术。
l 封锁的类型
1、 排它锁(Exclusive Locks,简称X锁)
2、 共享锁(Share Locks,简称S锁)。
n 排它锁
排它锁又称为写锁。若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加 任何类型的锁,直到T释放A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A。
n 共享锁
共享锁又称为读锁。若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S 锁,而不能加X锁,直到T释放A上的S锁。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
2 数据可以不一致,但是数据更新要进行一致性检查
1) 从数据库中读出一批初始数据,依据这些数据做了一系列的操作,当把操作结果更新到数据库 时,先检查数据库中那“同一批”初始数据是否已经发生了变化,如果发生了变化,根据业务需要,进行一定 的处理。这种方式并发性强,比较灵活,而且是不加锁的,这就避免了不少麻烦问题,实现起来要简单一些。
2) 简单考虑,检查数据一致性时,可以检查数据库中数据和内存中数据的值是否相同。但如果数 据量较大,这种检查恐怕效率很低。其实一致性检查要考虑粒度问题,根据实际情况选择合适的粒度。检查具 体数据的值是否变化,可以说是最细的粒度。可以通过数据的版本控制来实现更粗粒度的检查。以数据记录为 单位进行版本管理,可以在数据表中加一个整型字段作为版本。当insert一条数据时,设置一个初始版本值。
当update数据时,先检查数据库中的版本值是否发生了变化,如果没有变化才执行update,并将被更新的数据 版本值加1。根据业务逻辑,有时要把一组数据使用一个版本来管理(更粗的粒度),这可以使用一个专门存储 版本的表来实现。要注意的是,一致性检查和数据更新一定要在同一个系统事务中进行,才能保证一致性。
3) 这种方式同时也存在一定的问题,那就是其发现问题的滞后性,通常是在提交之后才报出相应 的错误,之前是不会报出的,这样导致用户之间所做的工作可能都是无用工,一个缓解的办法是,除了在最后提 交时检查一致性外,可以在业务事务进行过程中,时不时的就检查一下,越早发现不一致就可以越早的处理。这 也只是缓解,不能从根本上解决。
? 总结
事物都存在两个方面,有利有弊,数据的并发控制有利的一方面是:数据库是共享资源,通常有许多个事务 同时在运行;不利的一方面就是其带来的问题。在正确性和并发性之间权衡一下,这两方面有时是矛盾的,没法得 到完美的解决,两者之间只能达到一个平衡,任何绝对都不是最好的,看用户对那个方面更需要一些。
本文原创发布php中文网,转载请注明出处,感谢您的尊重!
php并发数据库操作,数据库的并发操作相关推荐
- 数据库-事务并发操作问题及并发的控制
事务并发操作出现几种问题 所谓事务,是用户定义的一个数据库操作序列,是数据库环境中的逻辑工作单元, 是一个不可分割的整体. 事务的这个4个特性简称为ACID特性,事务ACID特性可能遭到破坏的因素有: ...
- 并发环境下,先操作数据库还是先操作缓存?
点击上方"朱小厮的博客",选择"设为星标" 回复"1024"获取独家整理的学习资料 前言 在分布式系统中,缓存和数据库同时存在时,如果有写操 ...
- cache数据库和mysql_并发环境下,先操作数据库还是先操作缓存?
原标题:并发环境下,先操作数据库还是先操作缓存? 来源:捡田螺的小男孩 前言 在分布式系统中,缓存和数据库同时存在时,如果有写操作,先操作数据库还是先操作缓存呢?本文将分5种方案 展开阐述对比,谢谢阅 ...
- python访问数据库如何解决高并发_怎样解决数据库高并发的问题
怎样解决数据库高并发的问题?解决数据库高并发使用缓存式的Web应用程序架构.增加Redis缓存数据库.增加数据库索引.页面静态化.使用存储过程.MySQL主从读写分离.分表分库.负载均衡集群. 解决数 ...
- 数据库事务原理及并发、死锁
1. 什么是数据库事务 1.1 数据库事务是指作为单个逻辑工作单元执行的一系列操作(SQL语句).这些操作要么全部执行,要么全部不执行. 1.2 通过ACID实现数据库事务模型 1.2.1 原子性(A ...
- MySQL数据库应用第3章操作数据库
MySQL安装好以后,首先需要创建数据库,这是使用mysql各种功能的前提.本章将详细介绍数据的基本操作,主要内容包括数据库的创建和删除,不同类型的数据存储引擎和存储引擎的选择. 学习目标: 1.掌握 ...
- python多线程读取数据库数据_Python基于多线程操作数据库相关知识点详解
Python基于多线程操作数据库相关问题分析 本文实例分析了Python多线程操作数据库相关问题.分享给大家供大家参考,具体如下: python多线程并发操作数据库,会存在链接数据库超时.数据库连接丢 ...
- 缓存与数据库的一致性:先操作缓存还是先操作数据库?
数据缓存 在我们实际的业务场景中,一定有很多需要做数据缓存的场景,比如售卖商品的页面,包括了许多并发访问量很大的数据,它们可以称作是是"热点"数据,这些数据有一个特点,就是更新频率 ...
- python协程池操作mysql_python_协程方式操作数据库
#!/usr/bin/python3 # -*- coding: utf-8 -*- import requests import gevent import pymysql from gevent ...
- oracle数据库更新语句_20_手把手教你学Python之操作数据库
数据库是数据的仓库,将大量数据按照一定的方式组织并存储起来,方便进行管理和维护,例如快速检索和统计等.数据库的主要特点: 以一定的方式组织.存储数据: 能为多个用户共享: 与程序彼此独立. -- 数据 ...
最新文章
- numba.jit警告:failed type inference due to: non-precise type pyobject
- 数字图像处理实验(4):PROJECT 02-04 [Multiple Uses],Zooming and Shrinking Images by Bilinear Interpolation
- 复盘阿里城市大脑这3年
- python颜色识别算法_纯Python编写K-means算法,提取图片中的主体颜色
- html的各种基本标签 fylong,HTML:text标签不工作
- linux终端怎么设置monaco,ubuntu16.04安装monaco字体
- 连接mysql失败怎么办_数据库连接失败有什么原因?怎么解决?
- 微信开发学习总结(一)——微信开发环境搭建
- android设置输入数字英文,android 安卓editext默认弹出英文输入法,只能输入英文与数字(示例代码)...
- sFlow - 简介
- matlab低频滤波编程,各位朋友:求教用c语言实现低通滤波的程序!!!
- ProxmoxVE6.2 VLAN配置
- 微信小程序绑定银行卡功能
- 小技巧助你解决div+css网页内容显示不完整
- 区块链将是下一个风口,想飞的“猪”都在排队等候
- Android 平台camera相关梳理
- 医号馆诊所管理软件系统-部分功能更新!
- DB-Engines 9月数据库排名:ClickHouse一路猛冲,Redis坐稳第七(文末送书福利)
- mysql 将小写字段 转大写
- linux下面编译库文件,Linux下动态链接库文件的编译与使用