php - 数据库与逻辑应用分离的情况下怎么保证信息同步,或者叫安全
迷茫
迷茫 2017-04-17 16:48:34
0
6
961

我不太明白这个词怎么表达

是这样的,现在有一台服务器运行数据库(server),另外一台运行php程序(client),浏览器(Browser)访问client,然后client逻辑判断后通过http协议对server中的数据库进行CURD操作

有个问题就是,如果Browser的用户操作过快,而serverclient之间http请求太慢的话,就会导致client上获取的数据更新不及时,导致一些错误。。

栗子:一个用户只能买一个商品,用户点击之后,client先读取server的数据,判断是否已经购买,没有购买的话进行写入操作,然后购买完成,但是如果用户连着点击两次购买,两次操作一次进入client,然后由于clientserver之间网速或者其他一些问题,写入操作没有及时完成造成两次购买操作的判断为此用户未购买,于是会有两次写入server数据库的操作,就会造成错误。。

这个问题属于什么?应该怎么解决?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

모든 응답(6)
刘奇

인메모리 데이터베이스 또는 NOSQL 데이터베이스를 사용하여 클라이언트와 상호작용하면 인메모리 데이터베이스가 MYSQL과 같은 관계형 데이터베이스와 "동기화"됩니다.

클라이언트의 특정 작업을 확인하기 위해 데이터베이스 쿼리가 필요한 경우 동시성이 높은 상황에서는 오류가 쉽게 발생할 수 있습니다. 예를 들어 중복된 이름이 있는지 확인하기 위해 사용자 등록을 사용할 때 이론적으로는 먼저 사용자 이름이 있는지 확인하기 위해 데이터베이스를 쿼리한 다음 실제 작업에서는 이 논리를 삽입합니다. 깨졌고, 같은 이름의 사용자가 발견되었습니다.

따라서 핵심 데이터를 관계형 데이터베이스에 넣고, 속도가 필요한 경우 인메모리 데이터베이스를 사용하세요. 중복 쿼리를 줄이려면 캐싱을 적절하게 사용하세요.

左手右手慢动作

일반적인 해결 방법은 서버가 먼저 토큰을 제공하는 것입니다. 토큰이 있어야만 작업이 성공할 수 있으며 토큰이 모두 사용되면 만료된 것으로 표시됩니다. 이를 통해 작업이 반복되지 않도록 할 수 있을 뿐만 아니라 전류 제한과 같은 기능도 수행할 수 있습니다.

귀하의 질문에 문제가 있습니다. 데이터베이스와 비즈니스 서버 간의 통신 보안을 위해 SSL 프로토콜을 사용할 수 있습니다.

또 다른 접근 방식은 일관된 해싱을 사용하여 ID를 증가시키지 않고 비즈니스 ID를 계산하는 것입니다. 이를 통해 많은 작업이 멱등성을 갖도록 보장할 수 있습니다. 관심이 있다면 시도해 볼 수 있습니다.

Peter_Zhu

초대해 주셔서 감사합니다. Lizi 고객이 결정을 내릴 수 있습니다.

左手右手慢动作

토큰 할당은 물론 매우 좋은 솔루션입니다. 그러나 실제 적용에서는 다음 솔루션이 더 간결하고 효율적이라고 생각합니다.

  • 프론트엔드 js에서 처리할 경우 사용자가 두 번째 클릭을 하지 못하도록 [구매] 버튼을 클릭한 후 전체 화면 마스크가 팝업됩니다. 제거됨. 또한 플래그 비트를 사용하거나 기존 디바운스/스로틀 알고리즘을 사용할 수도 있습니다.

  • 또한 구매 과정에서 짧은 시간(예: 10초 이내) 내에 반복 구매가 이루어지면 "반복 작업을 하지 마세요"라는 오류가 바로 반환되도록 백그라운드에서 결정합니다. . 데이터베이스 측에서는 트랜잭션을 사용하고 트랜잭션의 격리 수준을 높이거나 잠금을 사용하는 것을 고려할 수 있습니다.

  • 일반적으로 프론트엔드 js에서 처리한 후에는 많은 문제를 피할 수 있습니다. 악의적인 사용자가 없다면 말이죠.

    伊谢尔伦

    동시 잠금을 추가하려면 redis, memcached 등을 사용하고 요청이 완료된 후 잠금을 해제할 수 있습니다.

    // 작업의 원자성입니다. 키가 유효한 시간인 30초 내에 설정되면 0이 반환됩니다. 일반적인 요청 시간 제한은 30초입니다.
    $redis->set($lock_key, 1, array("NX", "EX"=>'30'));
    黄舟

    위에서 보면 두 개의 서버가 있다는 것을 알 수 있습니다. 하나는 PHP를 실행하고 다른 하나는 db를 실행합니다. 그런데 왜 두 서버 간의 통신을 위해 http 프로토콜을 사용해야 할까요? mysql의 기본 연결 프로토콜을 사용하는 대신(mysql을 사용한다고 가정)? 즉, 서버의 데이터베이스에 php로 직접 접속한 후 DB를 운영해야 합니다.

    귀하의 예에서 언급된 연속 삽입 문제는 테이블 구조 설계를 통해 해결할 수 있습니다. 필드에 고유 인덱스 UNIQUE를 추가할 수 있습니다. 그 밖에도 몇 가지 방법이 있는데 개인적으로 유니크 인덱스 방법을 추천합니다

    최신 다운로드
    더>
    웹 효과
    웹사이트 소스 코드
    웹사이트 자료
    프론트엔드 템플릿