最近做的《选修课系统》需要考虑这样一个问题:数据库的并发操作带来的数据库数据不一致问题因为是全校性选修课,同一时间点大批学生选课,那么必然存在多名学生同时对同一数据进行操作是的问题,如果这种并发操作不加以控制的话,必会造成数据的不一致。 一
最近做的《选修课系统》需要考虑这样一个问题:数据库的并发操作带来的数据库数据不一致问题——因为是全校性选修课,同一时间点大批学生选课,那么必然存在多名学生同时对同一数据进行操作是的问题,如果这种并发操作不加以控制的话,必会造成数据的不一致。
一直知道有这种问题,并且知道这种问题的解决方法——加锁;但是有些东西之前了解的并不是很透彻,于是好好研究了一天,觉得理解的还可以,先总结一部分。
1,什么是并发操作?
数据库的一个重要特征是:支持数据共享,也就是说允许多个用户程序并行地存取数据库中的数据;那么,多用户或多事物可能同时对同一数据进行操作,这成为并发操作。
2,并发操作可能带来的影响?
如果不对并发操作进行控制的话,那么就会存取不正确的数据,破坏数据的完整性。——为什么这么说?下面进行介绍
在此之前,先说一下事务的概念。
3,什么是事务?
对一件完整的事儿,要么做完整,要么都不做。例如:学生选课—学生选上课时,需要将选课信息写入选课表的同时,更新课程表中的课程余量;如果在添加选课信息时,中断了(不能进行余量更新),那么就会事务回滚,即,数据回滚到没选课之前。
Begin Transaction
选课表中添加选课信息;
更新课程表中的课程余量;
Commit
RollBac
事务的SQL语句:
Begin Transaction开始事务
Commit提交事务
RollBack回滚
(注:事务中的多条SQL语句也是一条条执行的,当所有语句执行完后,提交事务,如果其中一条中断,则事务回滚所有操作回到语句执行之前)
事务的并发主要是为了提高效率,但是,同时它也带来了一定问题
4,并发操作带来的问题?
之前讲过并发操作——多用户或多事务同时对同一数据进行操作;
因为事务中的语句也是一条条执行的,所以存在多用户多事务同时对同一数据进行操作的情况;
并发操作带来的问题:
(1)丢失修改
(2)脏读
(3)不可重复读
4.1丢失修改
当两个或多个事务(或两个或多个用户)选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题。每个事务都不知道其它事务的存在(或每个用户操作时并不会考虑同一时刻是否有别的用户进行着同样的操作)。最后的更新将重写由其它事务所做的更新,这将导致数据丢失。
例子1:事务T1,事务T2,数据库中数据R=1000
a.t1时刻,事务T1读取R=1000;
b.过了一会儿 t2时刻,事务T2读取R=1000;
c.t3时刻,事务T1修改R=R-200(那么R=800)写入数据库(此时,数据库中R=800);
d.过了一会儿 t4时刻,事务T2修改R=R-100(因为在t2时刻读到的数据为R=1000,那么修改后R=900)写入数据库(此时,数据库中R=900)
那么最终,数据库中R=900;数据对吗?当然不对,因为T1、T2分别对R进行了-200 -100操作,最终数据应为R=700;事务T2的修改覆盖了T1的修改 ——丢失修改问题
例子2:选课:学生A、学生B、课程1的余量=20
a.学生A选择课程1时,先读出课程余量20
b.然而同一时刻(也可是不同时刻,只要在学生A更新数据之前),学生B也读出了课程1的余量20,
c.学生A选择此课程,课程1余量-1,写入数据库,此时课程1的余量=19;
d.学生B选择此课程,课程1余量-1(因为之前读出的课程1余量为20,-1后为19),写入数据库,此时课程1的余量=19;
课程余量=19 数据正确吗?不正确。实际情况课程余量应更新为18;——B的修改覆盖了A的修改 —— 丢失修改问题。
解决办法:加锁,只允许并发一个更新事务。
4.2脏读
当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,
另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个
事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。
例子1:事务T1,事务T2,数据库中数据R=1000;
T1:
Begin Transaction开始事务T1
ReadR=1000;(1)
R=R-200;(2)此时R=800
R=R+100;(3)此时R=900
Commit提交事务T1
a.当事务T1进行到第(2)后,即,数据库中的数据R=800时;
b.事务T2开始读R的值,读出的值为R=800;但此时事务T1还没有进行完整,还未提交事务;
c.之后事务T1进行第(3)步R=R+100,此时R=900 事务T1提交,此时数据库中R=900;
那么在事务T1提交事务之前,事务T2读出的数据(R=800)为脏数据;
例子2:
a.张三的工资为2000,元老板把张三的工资改为了8000元(但未提交事务)
2.张三查看自己的工资 ,发现工资变为了8000元
3.而后老板发现改错了,回滚了事务,张三的工资又变回了2000元
那么,张三读取的工资8000元就是脏数据。
解决办法:如果在第一个事务提交前,任何其他事务不可读取其修改过的值,则可以避免该问题。
4.3不可重复读
当第二个事务多次访问同一行而且每次读取不同的数据时,会发生不一致的分析问题。不一致的分析与未确认的相关性类似,因为其它事务也是正在更改第二个事务正在读取的数据。然而,在不一致的分析中,第二个事务读取的数据是由已进行了更改的事务提交的。而且,不一致的分析涉及多次(两次或更多)读取同一行,而且每次信息都由其它事务更改;因而该行被非重复读取。
在一个事务中前后两次读取的结果并不致,导致了不可重复读。
例子1:事务T1、事务T2、张三的工资=1000
a.事务T1中,张三读取了自己的工资为1000元,操作并没有完成
b.此时(事务T1读取了张三工资为1000元)事务2中,修改了张三的工资为2000元,并提交了事务.
c.此时(事务T1读取了张三工资为1000元,事务T2修改了张三的工资为2000元)在事务1中,张三再次读取自己的工资时,工资变为了2000
那么,同一个事务中,前后读取的数据不一致 —— 不可重复读问题。
解决办法:如果只有在修改事务完全提交之后才可以读取数据,则可以避免该问题。
总结:
(1)事务的并发主要是为了提高效率,但是,同时它也带来了一定问题——丢失修改、读脏数据、不可重复读
(2)结合生活中实例,理解丢失修改、读脏数据、不可重复读问题。
个人理解,如果哪里有理解偏差,忘纠正!
下篇博客会总结“锁”的概念,并解释“锁”是如何解决并发造成的数据不一致问题。

MySQL은 GPL 라이센스를 사용합니다. 1) GPL 라이센스는 MySQL의 무료 사용, 수정 및 분포를 허용하지만 수정 된 분포는 GPL을 준수해야합니다. 2) 상업용 라이센스는 공개 수정을 피할 수 있으며 기밀이 필요한 상업용 응용 프로그램에 적합합니다.

MyISAM 대신 InnoDB를 선택할 때의 상황에는 다음이 포함됩니다. 1) 거래 지원, 2) 높은 동시성 환경, 3) 높은 데이터 일관성; 반대로, MyISAM을 선택할 때의 상황에는 다음이 포함됩니다. 1) 주로 읽기 작업, 2) 거래 지원이 필요하지 않습니다. InnoDB는 전자 상거래 플랫폼과 같은 높은 데이터 일관성 및 트랜잭션 처리가 필요한 응용 프로그램에 적합하지만 MyISAM은 블로그 시스템과 같은 읽기 집약적 및 트랜잭션이없는 애플리케이션에 적합합니다.

MySQL에서 외국 키의 기능은 테이블 간의 관계를 설정하고 데이터의 일관성과 무결성을 보장하는 것입니다. 외국 키는 참조 무결성 검사 및 계단식 작업을 통해 데이터의 효과를 유지합니다. 성능 최적화에주의를 기울이고 사용할 때 일반적인 오류를 피하십시오.

MySQL에는 B-Tree Index, Hash Index, Full-Text Index 및 공간 인덱스의 네 가지 주요 인덱스 유형이 있습니다. 1.B- 트리 색인은 범위 쿼리, 정렬 및 그룹화에 적합하며 직원 테이블의 이름 열에서 생성에 적합합니다. 2. HASH 인덱스는 동등한 쿼리에 적합하며 메모리 저장 엔진의 HASH_Table 테이블의 ID 열에서 생성에 적합합니다. 3. 전체 텍스트 색인은 기사 테이블의 내용 열에서 생성에 적합한 텍스트 검색에 사용됩니다. 4. 공간 지수는 지리 공간 쿼리에 사용되며 위치 테이블의 Geom 열에서 생성에 적합합니다.

toreateanindexinmysql, usethecreateindexstatement.1) forasinglecolumn, "createindexidx_lastnameonemployees (lastname);"2) foracompositeIndex를 사용하고 "createDexIdx_nameonemployees (forstName, FirstName);"3)을 사용하십시오

MySQL과 Sqlite의 주요 차이점은 설계 개념 및 사용 시나리오입니다. 1. MySQL은 대규모 응용 프로그램 및 엔터프라이즈 수준의 솔루션에 적합하며 고성능 및 동시성을 지원합니다. 2. SQLITE는 모바일 애플리케이션 및 데스크탑 소프트웨어에 적합하며 가볍고 내부질이 쉽습니다.

MySQL의 인덱스는 데이터 검색 속도를 높이는 데 사용되는 데이터베이스 테이블에서 하나 이상의 열의 주문 구조입니다. 1) 인덱스는 스캔 한 데이터의 양을 줄임으로써 쿼리 속도를 향상시킵니다. 2) B-Tree Index는 균형 잡힌 트리 구조를 사용하여 범위 쿼리 및 정렬에 적합합니다. 3) CreateIndex 문을 사용하여 CreateIndexIdx_customer_idonorders (customer_id)와 같은 인덱스를 작성하십시오. 4) Composite Indexes는 CreateIndexIdx_customer_orderOders (Customer_id, Order_Date)와 같은 다중 열 쿼리를 최적화 할 수 있습니다. 5) 설명을 사용하여 쿼리 계획을 분석하고 피하십시오

MySQL에서 트랜잭션을 사용하면 데이터 일관성이 보장됩니다. 1) STARTTRANSACTION을 통해 트랜잭션을 시작한 다음 SQL 작업을 실행하고 커밋 또는 롤백으로 제출하십시오. 2) SavePoint를 사용하여 부분 롤백을 허용하는 저장 지점을 설정하십시오. 3) 성능 최적화 제안에는 트랜잭션 시간 단축, 대규모 쿼리 방지 및 격리 수준을 합리적으로 사용하는 것이 포함됩니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

WebStorm Mac 버전
유용한 JavaScript 개발 도구

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.
