Files
Mitgliederverwaltung/.plans/open/issue-203-missing-database-transactions.md
T
shahondin1624 b29a268b1d Restructure .plans/ into done/ and open/ subdirectories
- Move completed plan files to .plans/done/
- Move 18 open plan files to .plans/open/
- Update .gitignore to exclude .verified_plans temp file
- Verified all 18 open plans still describe unimplemented issues
2026-04-28 20:30:55 +02:00

1.7 KiB

Issue #203: Missing Database Transactions in MemberService

Problem

The MemberService::create() method inserts a member and its sub-entities (addresses, phones, emails) in separate queries without a transaction:

public function create(array $data, array $addresses = [], ...): array {
    // ...
    $member = $this->memberMapper->insert($member);
    
    $savedAddresses = $this->saveAddresses($member->getId(), $addresses);
    $savedPhones = $this->savePhones($member->getId(), $phones);
    $savedEmails = $this->saveEmails($member->getId(), $emails);
    // ...
}

If savePhones() fails, the member is created but phones are not attached.

Similarly, softDelete() deletes sub-entities separately without a transaction.

Impact

  • Data inconsistency if partial failures occur
  • Orphaned sub-entities on failed member creation
  • Orphaned member on failed sub-entity creation

Solution

Wrap the operation in a transaction:

use OCP\DB\Events\SQLFileEmitter;

public function create(array $data, ...): array {
    $this->db->beginTransaction();
    try {
        $member = $this->memberMapper->insert($member);
        $savedAddresses = $this->saveAddresses($member->getId(), $addresses);
        // ...
        $this->db->commit();
    } catch (\Exception $e) {
        $this->db->rollback();
        throw $e;
    }
}

Tasks

  • Add transaction wrapping to MemberService::create()
  • Add transaction wrapping to MemberService::softDelete()
  • Add transaction wrapping to MemberService::update() (sync operations)
  • Verify rollback works correctly on failure
  • Consider adding a DbTransactionTrait for reusability

Labels

  • bug
  • backend
  • priority:high
  • data-integrity