Kacam.net

데이터베이스

先查再改,为什么会丢

「包进事务里不就行了」——事务到底挡住了什么?

프롬프트를 복사한 뒤 한 곳을 고르세요. 답을 늘어놓는 대신 면접관이 되어 장면마다 캐묻습니다.

앱이 설치된 휴대폰이면 시스템이 바로 앱을 엽니다. 위챗 안에서는 외부 앱을 열 수 없으니 먼저 브라우저로 여세요.

복사한 글 끝에는 채점용 정답이 붙어 있습니다. 먼저 읽지 마세요 —— 스스로 끌어내 봤는지가 핵심입니다.

这是所有并发 bug 里最常见的一种形状:读出来、判断一下、再写回去。而「加个事务」几乎不解决它 —— 两个事务照样能分别读到 stock = 1。

这一份要你自己画出那条让库存变成 -1 的时间线,然后一步步收窄:把判断挪进 WHERE、看受影响行数、什么时候该用版本号、什么时候该交给唯一约束。

有一问值得先想想:「打开编辑器就锁住、保存时才放」为什么在 Web 上几乎一定是错的。

★★★☆☆ · 약 30분 · 무엇을 보는가: 读改写的窗口、条件更新、版本号 vs FOR UPDATE、唯一约束

이 문제가 연습시키는 것

락 다중 버전과 가시성

이 문제 해봤나

로그인하면 이 문제를 해봤다고 기록할 수 있습니다. 다음에 오면 언제 했는지 보입니다.

해본 사람들의 기록

아직 아무도 쓰지 않았습니다. 해본 뒤에 무엇이 나왔는지 적어 주세요 — 어느 장면에서 막혔는지, 나중에 바꾼 결론은 무엇인지.

로그인 후에 기록을 남길 수 있습니다.

사용법

이 시리즈는 학습형입니다: 몰아붙이지 않고 이끌어 줍니다. 막히면 먼저 어느 층에서 막혔는지(들어본 적 없다 / 알지만 이유를 모른다 / 알지만 못 쓴다) 묻고 나서 무엇을 줄지 정합니다. 같은 지점에서 두 번 이끌어도 안 통할 때만 직접 설명하고, 설명한 뒤에는 당신 말로 다시 말하게 합니다.

기본은 MySQL / InnoDB 기준입니다 —— 이 분야의 함정은 절반이 구현 세부사항이라, 클러스터형 인덱스·리프에서 다시 찾아오기·갭 락은 다른 제품에서 다르게 동작합니다. PostgreSQL 등도 괜찮습니다. 첫 문장에서 무엇을 쓰는지 말하면 그쪽 기준으로 설명하고 결론이 달라지는 지점을 짚어 줍니다.

시작하는 법

  1. 하나 골라서 열고, 프롬프트를 복사합니다.
  2. 새 빈 대화에 붙여 넣고, 첫 문장에서 어떤 제품 어떤 버전인지 말합니다(말하지 않으면 MySQL 8로 봅니다).
  3. 그다음에는 아무 말 없이 첫 질문을 기다립니다.

도중에 언제든 외칠 수 있는 네 가지

  • 跳过 바로 다음 장면으로
  • 换个说法 이 부분을 다른 각도로 다시
  • 直说吧 완전한 답을 말하고, 그다음 내게 복창시키기
  • 复盘 바로 마무리 카드로

세 가지 함정

  • 끝에 있는 정답지를 먼저 읽지 마세요 —— 「흔히 잘못 아는 것」 항목이 곧 매 질문의 답입니다.
  • 숫자를 요구받을 각오를 하세요. 「좀 빨라진다」「IO를 아낀다」는 즉시 끊깁니다: 몇 행? 몇 번? 몇 배? 숫자 없는 결론은 외운 것입니다.
  • 칭찬을 시작하면 「칭찬하지 말라」 조항을 상기시키세요. 이끄는 것과 달래는 것은 다릅니다.

복합 인덱스부터 하세요. 이 시리즈의 토대라서 「락은 인덱스 레코드에 걸린다」「왜 이렇게 많은 행을 읽나」가 모두 그 한 문장에 기댑니다. 운영에서 동시성에 물리고 있다면 「읽고 나서 고치기」부터, 쿼리가 느리면 실행 계획부터.