? 数据库并发操带来的问题 数据的不一样,包括三类 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并发数据库操作,数据库的并发操作相关推荐

  1. 数据库-事务并发操作问题及并发的控制

    事务并发操作出现几种问题 所谓事务,是用户定义的一个数据库操作序列,是数据库环境中的逻辑工作单元, 是一个不可分割的整体. 事务的这个4个特性简称为ACID特性,事务ACID特性可能遭到破坏的因素有: ...

  2. 并发环境下,先操作数据库还是先操作缓存?

    点击上方"朱小厮的博客",选择"设为星标" 回复"1024"获取独家整理的学习资料 前言 在分布式系统中,缓存和数据库同时存在时,如果有写操 ...

  3. cache数据库和mysql_并发环境下,先操作数据库还是先操作缓存?

    原标题:并发环境下,先操作数据库还是先操作缓存? 来源:捡田螺的小男孩 前言 在分布式系统中,缓存和数据库同时存在时,如果有写操作,先操作数据库还是先操作缓存呢?本文将分5种方案 展开阐述对比,谢谢阅 ...

  4. python访问数据库如何解决高并发_怎样解决数据库高并发的问题

    怎样解决数据库高并发的问题?解决数据库高并发使用缓存式的Web应用程序架构.增加Redis缓存数据库.增加数据库索引.页面静态化.使用存储过程.MySQL主从读写分离.分表分库.负载均衡集群. 解决数 ...

  5. 数据库事务原理及并发、死锁

    1. 什么是数据库事务 1.1 数据库事务是指作为单个逻辑工作单元执行的一系列操作(SQL语句).这些操作要么全部执行,要么全部不执行. 1.2 通过ACID实现数据库事务模型 1.2.1 原子性(A ...

  6. MySQL数据库应用第3章操作数据库

    MySQL安装好以后,首先需要创建数据库,这是使用mysql各种功能的前提.本章将详细介绍数据的基本操作,主要内容包括数据库的创建和删除,不同类型的数据存储引擎和存储引擎的选择. 学习目标: 1.掌握 ...

  7. python多线程读取数据库数据_Python基于多线程操作数据库相关知识点详解

    Python基于多线程操作数据库相关问题分析 本文实例分析了Python多线程操作数据库相关问题.分享给大家供大家参考,具体如下: python多线程并发操作数据库,会存在链接数据库超时.数据库连接丢 ...

  8. 缓存与数据库的一致性:先操作缓存还是先操作数据库?

    数据缓存 在我们实际的业务场景中,一定有很多需要做数据缓存的场景,比如售卖商品的页面,包括了许多并发访问量很大的数据,它们可以称作是是"热点"数据,这些数据有一个特点,就是更新频率 ...

  9. python协程池操作mysql_python_协程方式操作数据库

    #!/usr/bin/python3 # -*- coding: utf-8 -*- import requests import gevent import pymysql from gevent ...

  10. oracle数据库更新语句_20_手把手教你学Python之操作数据库

    数据库是数据的仓库,将大量数据按照一定的方式组织并存储起来,方便进行管理和维护,例如快速检索和统计等.数据库的主要特点: 以一定的方式组织.存储数据: 能为多个用户共享: 与程序彼此独立. -- 数据 ...

最新文章

  1. numba.jit警告:failed type inference due to: non-precise type pyobject
  2. 数字图像处理实验(4):PROJECT 02-04 [Multiple Uses],Zooming and Shrinking Images by Bilinear Interpolation
  3. 复盘阿里城市大脑这3年
  4. python颜色识别算法_纯Python编写K-means算法,提取图片中的主体颜色
  5. html的各种基本标签 fylong,HTML:text标签不工作
  6. linux终端怎么设置monaco,ubuntu16.04安装monaco字体
  7. 连接mysql失败怎么办_数据库连接失败有什么原因?怎么解决?
  8. 微信开发学习总结(一)——微信开发环境搭建
  9. android设置输入数字英文,android 安卓editext默认弹出英文输入法,只能输入英文与数字(示例代码)...
  10. sFlow - 简介
  11. matlab低频滤波编程,各位朋友:求教用c语言实现低通滤波的程序!!!
  12. ProxmoxVE6.2 VLAN配置
  13. 微信小程序绑定银行卡功能
  14. 小技巧助你解决div+css网页内容显示不完整
  15. 区块链将是下一个风口,想飞的“猪”都在排队等候
  16. Android 平台camera相关梳理
  17. 医号馆诊所管理软件系统-部分功能更新!
  18. DB-Engines 9月数据库排名:ClickHouse一路猛冲,Redis坐稳第七(文末送书福利)
  19. mysql 将小写字段 转大写
  20. linux下面编译库文件,Linux下动态链接库文件的编译与使用

热门文章

  1. 商友ERP系统---结算方面几项事宜
  2. html页面跳转方式 + 跳转传参
  3. BootStrap入门响应式栅栏
  4. java集群如何同步_Kafka 跨集群同步方案
  5. 2019年初,我收到人生中的第一笔稿费
  6. Vue知识点笔记(基础篇)
  7. SqlServer事务回滚
  8. PHP 调用阿里云短信服务API发送短信
  9. PHP根据配置设置可变变量
  10. Jquery 对象求和