programing

데이터베이스 세션과 관련하여 데이터베이스 잠금 및 웹 서버가 어떻게 협업합니까?

easyjava 2023. 9. 11. 22:26
반응형

데이터베이스 세션과 관련하여 데이터베이스 잠금 및 웹 서버가 어떻게 협업합니까?

이 질문은 웹 서버, 데이터베이스 서버, php application 등 광범위한 영역이 설정되어 있기 때문에 스택 오버플로우에 해당하는지는 모르겠지만, 이 질문이 어플리케이션 코드 작성에 도움이 될 것이기 때문에 여기에 묻기로 했습니다.

데이터베이스 세션과 웹 서버가 어떻게 연동되는지 혼란스럽습니다.제 말이 맞다면, 클라이언트에 대한 연결이 만들어지면 해당 연결에 대해 하나의 세션만 생성되며, 이 세션은 연결이 끊어지거나 오랜 비활성으로 인해 다시 연결될 때까지 지속됩니다.

웹 서버, 특히 MariaDB 10.3.10이 지원하는 데이터베이스를 갖춘 PHP 7.2 애플리케이션(가상 호스트에서)을 실행하는 Apache 2.4를 생각해보면 다음과 같은 시나리오가 있습니다(만약 문제가 된다면 Fedora 28에서).

  • 각 웹 응용 프로그램에 대해, 현재 우리는 Laravel을 사용하고 있으며, 첫 번째 쿼리가 서비스되는 URL에 적중되는 즉시 하나의 데이터베이스 연결만 이루어질 것입니다.
  • 그 후에는 데이터베이스 세션이 하나만 있습니다.쿼리가 제공되면 응용프로그램이 수신한 다른 쿼리에서 다시 사용할 수 있도록 연결이 활성 상태로 유지됩니다.이는 애플리케이션이 24x7로 웹 요청을 지속적으로 수신하는 경우 연결도 계속 유지되고 mysqld 또는 httpd를 다시 시작할 때만 연결이 끊어질 가능성이 높다는 것을 의미하며, 이는 몇 달 안에 일어나지 않을 수도 있습니다.
  • 한 번에 20명 정도의 사용자가 동일한 Apache 서버와 Laravel 애플리케이션 파일을 사용하므로(애플리케이션 인스턴스를 호출할 수 있다고 가정합니다) 20명의 모든 사용자는 동일한 데이터베이스 연결 및 데이터베이스 세션을 통해 서비스를 받게 됩니다.

위에서 언급한 모든 사용 사례가 맞다면 데이터베이스 잠금의 개념이 매우 혼란스러워 보입니다.예를 들어, 우리가 독점적인 잠금장치를 발행할 것이라고 가정해 보겠습니다.lock tables t1 write;, 동시 세션에 대한 더러운 읽기 및 쓰기 작업을 방지하기 위해 다른 세션의 읽기 및 쓰기를 차단합니다.그러나 20명의 모든 사용자가 동일한 세션과 연결을 동시에 사용하기 때문에 데이터베이스 잠금 메커니즘에서 필요한 동시성 안전을 얻을 수 없습니다.

질문:

  1. 웹 애플리케이션 측면에서 데이터베이스 잠금, 명시적 배타적 잠금이 어떻게 작동합니까?
  2. Laravel 애플리케이션에서 수신되는 웹 요청마다 새로운 연결 및 세션이 생성됩니까, 아니면 하나의 연결 및 세션만 재사용됩니까?
  3. 각 데이터베이스 연결에는 한 번에 하나의 세션만 사용됩니까?
  4. 이 명령은 현재 활성 세션 또는 연결을 표시합니까?show status where변수_이름= 'Threads_connected'? 현재 활성 연결을 보여주는 경우 현재 활성 데이터베이스 세션을 얻는 방법은 무엇입니까?

Apache는 이 시나리오의 세션과는 아무런 관련이 없습니다(대부분).데이터베이스 연결 및 세션은 php 자체적으로 처리됩니다.

연결 풀링을 사용하도록 설정하지 않으면 데이터베이스 세션은 재사용되지 않으며, 각 요청은 고유한 연결을 열고 끝에 닫습니다.

연결 풀링이 활성화된 경우 요청을 처리하는 스레드는 풀에서 프로세스 관리자로 연결할 것을 요청합니다.fpm아니면mod_php풀에서 사용 가능한 연결을 반환하지만, 동시 요청 수만큼의 세션이 여전히 존재합니다(단, 어떤 것도 누르지 않는 한).max_한계).일반적인 참조는 더 상세하게 설명되지만 하이라이트는 다음과 같습니다.

지속적인 연결은 동일한 링크에서 '사용자 세션'을 열 수 있는 기능을 제공하지 않으며, 트랜잭션을 효율적으로 구축할 수 있는 기능을 제공하지 않으며, 다른 많은 작업을 수행하지도 않습니다.사실, 이 주제에 대해 매우 명확하게 말하자면, 지속적인 연결은 그들의 비지속적인 형제들에게는 불가능했던 어떤 기능도 제공하지 못합니다.

연결 풀을 사용할 수 있더라도 관리자는 클라이언트에 연결을 반환하기 전에 몇 가지 정리 작업을 실행해야 합니다.그 중 하나가 테이블 잠금 해제입니다.

연결 참조 및 영구 연결 참조를 참조할 수 있습니다.mysqli자세한 내용은 내선번호를 참조하십시오.

그러나 여러 클라이언트 세션이 하나의 연결을 공유하는 방식을 설명하는 방식은 가능하며 실험적이기 때문에 더 많은 단점이 있습니다.세션 다중화라고 합니다.

언급URL : https://stackoverflow.com/questions/52754521/how-database-locks-and-web-server-collaborate-with-respect-to-database-sessions

반응형