웹 응용 프로그램을 개발할 때는 데이터베이스의 동시 제어 및 잠금 메커니즘이 중요합니다. 특히 동시 동시 시나리오에서 동시 데이터 액세스가 올바르게 처리되지 않으면 데이터 일관성 및 무결성 문제가 발생할 수 있습니다. 이 기사는 PHP에서 Oracle 데이터베이스의 동시성 제어 및 잠금 메커니즘을 사용하는 방법을 소개하고 두 가지 일반적인 동시성 제어 방법, 비관적 동시성 제어 및 낙관적 동시성 제어를 보여주고 관련 코드 예제를 제공합니다.
비관적 동시성 제어는 다른 사용자가 동일한 데이터를 동시에 수정하는 것을 방지하기 위해 작업을 수행하기 전에 데이터를 잠그는 것을 말합니다. Oracle Database에서는 For Update 문을 사용하여 비관적 동시성 제어를 달성 할 수 있습니다.
다음은 PHP에서 비관적 동시성 제어를 사용한 코드 예입니다.
<?php
// 연결하다Oracle데이터 베이스
$conn = oci_connect('username', 'password', 'database');
// 업데이트 및 잠겨 있어야하는 데이터를 쿼리하십시오.
$query = "SELECT * FROM my_table WHERE id = :id FOR UPDATE";
$stmt = oci_parse($conn, $query);
$id = 1;
oci_bind_by_name($stmt, ':id', $id);
oci_execute($stmt);
// 데이터 업데이트
$query = "UPDATE my_table SET field = :field WHERE id = :id";
$stmt = oci_parse($conn, $query);
$field = 'new value';
oci_bind_by_name($stmt, ':field', $field);
oci_bind_by_name($stmt, ':id', $id);
oci_execute($stmt);
// 提交事务并关闭연결하다
oci_commit($conn);
oci_close($conn);
?>
위의 코드에서 먼저, 업데이트 해야하는 데이터 행은 SELECT ... 업데이트 문을 통해 잠겨 있습니다. 업데이트 조작을 위해 업데이트 작업이 수행되고 마지막으로 Transactaction은 OCI_COMMIT ()을 사용하여 제출되고 OCI_Close ()를 통해 데이터베이스 연결이 닫힙니다.
비관적 동시성 제어와 달리, 낙관적 동시성 제어는 작동 전에 잠기지 않지만 데이터가 수정 될 때 다른 사용자가 데이터를 수정했는지 확인합니다. Oracle에서 낙관적 동시성 제어는 문들 사이의 버전 을 통해 달성 될 수 있습니다.
다음은 PHP에서 낙관적 동시성 제어를 사용하는 코드 예입니다.
<?php
// 연결하다Oracle데이터 베이스
$conn = oci_connect('username', 'password', 'database');
// 데이터를 쿼리하고 버전 정보를 얻습니다
$query = "SELECT * FROM my_table WHERE id = :id";
$stmt = oci_parse($conn, $query);
$id = 1;
oci_bind_by_name($stmt, ':id', $id);
oci_execute($stmt);
$row = oci_fetch_array($stmt, OCI_ASSOC);
$oldVersion = $row['VERSION'];
// 데이터 업데이트
$newVersion = $oldVersion + 1;
$query = "UPDATE my_table SET field = :field, version = :newVersion WHERE id = :id AND version = :oldVersion";
$stmt = oci_parse($conn, $query);
$field = 'new value';
oci_bind_by_name($stmt, ':field', $field);
oci_bind_by_name($stmt, ':newVersion', $newVersion);
oci_bind_by_name($stmt, ':id', $id);
oci_bind_by_name($stmt, ':oldVersion', $oldVersion);
oci_execute($stmt);
// 업데이트 된 행의 수를 확인하십시오
if (oci_num_rows($stmt) == 0) {
// 업데이트가 실패했습니다,데이터가 수정되었습니다
oci_rollback($conn);
} else {
// 성공적으로 업데이트하십시오
oci_commit($conn);
}
// 关闭연결하다
oci_close($conn);
?>
이 코드 예제에서 먼저 데이터를 쿼리하고 이전 버전 정보를 가져옵니다. 그런 다음 업데이트를 수행 할 때 WHERE 절에서 버전 번호를 사용하여 데이터가 변경되었는지 확인하십시오. 버전 번호가 일관되지 않으면 다른 사용자가 데이터를 수정했으며 업데이트 작업이 실패하고 롤백이 수행됩니다. 그렇지 않으면 제출 작업을 수행하십시오.
PHP에서 Oracle 데이터베이스를 사용할 때는 비관적 동시성 제어 및 낙관적 동시성 제어를 통해 데이터 일관성을 보장 할 수 있습니다. 비관적 동시성 제어는 잠금을 추가하여 동시 충돌을 피하고 낙관적 동시성 제어는 업데이트 될 때 데이터 버전을 점검하여 충돌이 적은 시나리오에 적합합니다. 비즈니스 요구에 따라 적절한 동시성 제어 전략을 선택하는 것은 데이터베이스의 안정성과 응용 프로그램의 효율성에 중요합니다.
이 기사는 PHP에서 Oracle 데이터베이스의 동시성 제어 및 잠금 메커니즘을 구현하는 방법을 소개하며 동시 액세스를 처리 할 때 개발자에게 도움이되기를 희망합니다.