lock(true)->save($data);"."/> lock(true)->save($data);".">

 >  기사  >  PHP 프레임워크  >  thinkphp에서 테이블을 잠그는 방법

thinkphp에서 테이블을 잠그는 방법

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼원래의
2019-08-22 11:33:274730검색

thinkphp에서 테이블을 잠그는 방법

최근 동시성이 많지 않은 등록 시스템을 작성해야 하는데, 여전히 여러 사람이 동시에 가입하는 것은 가능합니다. 등록에는 순서가 포함되므로 행이나 테이블이 잠겨 있지 않으면 다음 상황이 발생합니다.

예:

현재 사용자 A만 시스템에 등록되어 있으며 순서는 다음과 같습니다. 1, (A, 1)로 기록됨;

특정 시간 t에 사용자 B, 사용자 C, 사용자 D가 동시에 등록되었으며 백엔드는 B, C의 등록 요청을 받았습니다. , D가 거의 동시에 등록되어 있어서 등록양식을 확인해 보니 현재 (A, 1)만 있는 것을 확인하여 (B, 2), (C, 2), (D, 2)를 입력했습니다. 등록 양식을 작성하고 결과를 받았습니다:

(A, 1)

(B, 2)

(C, 2)

(디, 2).

첫번째 생각은 주문을 기록하지 않고 삽입 타임스탬프를 기록한다는 것입니다. 이 경우에는

(A, ta)#입니다. 🎜🎜##🎜🎜 #(B,tb)

(C,tc)

(D,td).

ta, tb, tc, td가 동일하다는 것은 거의 불가능합니다.

관련 권장 사항: "

ThinkPHP Tutorial

" 그러나 이렇게 해도 해결할 수 없는 세 가지 문제가 있습니다.

# 🎜🎜#1. 타임스탬프가 동일할 수도 있지만 확률은 매우 낮습니다.

2 이는 직관적이지 않으며

#🎜🎜 #3. 등록 시 인원 제한을 사용하세요. 등록은 40명으로 제한되며 현재 등록 승인 여부에 대한 즉각적인 피드백이 제공됩니다.

현재 해결 방법은 데이터베이스 잠금을 통해 해결하는 것입니다.


온라인에서 많은 정보를 확인한 결과 ThinkPHP에 비관적 잠금과 낙관적 잠금을 추가할 수 있다는 사실을 발견했습니다. 대상 시스템의 액세스 양이 적으므로 비관적 잠금을 사용하면 됩니다.

MyISAM은 테이블만 잠글 수 있는 반면 InnoDB는 행을 잠글 수 있습니다. 대상 시스템에서 테이블을 잠그십시오.

공식 문서에 제시된 잠금 테이블 방식은 다음과 같습니다:

$User->lock(true)->save($data);// 使用悲观锁功能

그러나 대상 시스템은 일련의 작업을 수행해야 하므로 사용되는 잠금 테이블 코드는 다음과 같습니다. # 🎜🎜#

M()->query("lock tables yourtable write");
// TODO
// your code
M()->query("unlock tables");
# 🎜🎜#실제 효과는 잘 작동합니다. [실제 날짜는 필터링되었습니다.]:

??-??-?? 10:00:00   1
??-??-?? 10:00:00   2
??-??-?? 10:00:00   3
??-??-?? 10:00:00   4
??-??-?? 10:00:01   5
??-??-?? 10:00:01   6
??-??-?? 10:00:01   7
??-??-?? 10:00:01   8
??-??-?? 10:00:02   9
??-??-?? 10:00:02   10
??-??-?? 10:00:02   11
??-??-?? 10:00:02   12
??-??-?? 10:00:02   13
??-??-?? 10:00:02   14
??-??-?? 10:00:03   15
??-??-?? 10:00:03   16
??-??-?? 10:00:03   17
??-??-?? 10:00:05   18
??-??-?? 10:00:06   19
??-??-?? 10:00:07   20
??-??-?? 10:00:08   21
??-??-?? 10:00:10   22
??-??-?? 10:00:15   23
??-??-?? 10:00:17   24
??-??-?? 10:00:19   25
??-??-?? 10:00:19   26
??-??-?? 10:00:24   27
??-??-?? 10:00:25   28
??-??-?? 10:00:34   29
??-??-?? 10:00:35   30
??-??-?? 10:00:38   31
??-??-?? 10:01:06   32
??-??-?? 10:01:11   33
??-??-?? 10:01:11   34
??-??-?? 10:01:17   35
??-??-?? 10:01:18   36
??-??-?? 10:02:27   37
??-??-?? 10:02:38   38
??-??-?? 10:02:39   39
??-??-?? 10:02:57   40

위 내용은 thinkphp에서 테이블을 잠그는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.