Write a complete, single-file data-access service (Python 3.11+ asyncio, stdlib only) that wraps a **mock** Postgres connection pool. It must demonstrate correct pooling, parameterized queries, pagination, and transactional integrity.

### Mock layer
Provide an in-memory mock that stands in for a real pool. Something like:
`async def acquire() -> Connection` / `connection.release()`, where `Connection` has
`async def fetch(query, params)` and `async def execute(query, params)`. Seed it with ~25
"users" and ~5 "posts" per user. Make `acquire()` sometimes wait briefly and make it
**track how many connections are checked out** so leaks are detectable.

### Service API
1. `async def get_users(page: int, page_size: int) -> dict` — returns `{"items": [...], "page": p, "page_size": s, "total": N}`. Validate page/page_size (page ≥ 1, 1 ≤ page_size ≤ 100).
2. `async def get_user_with_posts(user_id: int) -> dict` — one user + their posts (efficient: don't N+1).
3. `async def relabel_users(pairs: list[tuple[int, str]]) -> int` — bulk update each user's `label`. Transactional: if ANY update fails (e.g. an id doesn't exist), the whole batch rolls back and returns 0 (or raises) — never partially applied.

### Requirements
1. **Connection-pool discipline:** every acquire is paired with a release in a `finally`/context manager. The service must prove across 100 calls that connections-in-use returns to 0 (no leak).
2. **Parameterized queries:** all queries pass values as parameters (mock `(query, params)`), NEVER string-interpolated. Include at least one test that would "fail" on injection if interpolation were used.
3. **Pagination correctness:** `total` is the true count regardless of page; last page returns the correct remainder; out-of-range page returns empty (not an error).
4. **Transactional bulk:** `relabel_users` wraps all updates in one transaction; a partial failure rolls back. Prove it.
5. **Acquire timeout:** `acquire()` must respect a max-wait (e.g. 2s) and raise a clear error if the pool is exhausted, rather than hanging.
6. **No silent failures:** missing user → clear `KeyError`-style result; bad params → validation error.

### Included tests
Include a runnable test section that asserts:
- a) 100 sequential `get_users` calls leave the pool at 0 checked-out (no leak).
- b) Pagination math: total matches seed count; last page has the right remainder.
- c) `relabel_users` with one bad id rolls back — verify NO labels changed afterward.
- d) Concurrent `get_user_with_posts` for 10 users at once completes without pool exhaustion.

Provide clean, well-commented code that runs directly via `python file.py`.
