C# C#  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Доступ к данным и транзакции

Проверяет ADO.NET, параметры, транзакции, ORM-компромиссы и производительность доступа к данным. Вопросы требуют увидеть утечку соединения, неверный тип параметра, потерю атомарности, N+1 и границу, где сетевой вызов нельзя прятать внутри транзакции.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. В заданиях с кодом учитывайте указанную конструкцию и не додумывайте отсутствующие условия. После завершения откроются общий результат, тематические шкалы и разбор каждого ответа.
Вопрос 1 из 30
Почему SqlConnection обычно создают на операцию и Dispose-ят?
C#
await using var connection = new SqlConnection(connectionString);
await connection.OpenAsync(token);
return await QueryAsync(connection, token);
Вопрос 2 из 30
В каком порядке живут объекты?
C#
await using var connection = new SqlConnection(cs);
await connection.OpenAsync(token);
await using var command = new SqlCommand(sql, connection);
await using var reader = await command.ExecuteReaderAsync(token);
while (await reader.ReadAsync(token)) { /* read */ }
Вопрос 3 из 30
Почему GetInt32 лучше Convert.ToInt32(reader["id"]) при известной схеме?
Вопрос 4 из 30
Как обработать SQL NULL?
C#
var ordinal = reader.GetOrdinal("middle_name");
string? middle = await reader.IsDBNullAsync(ordinal, token)
    ? null
    : reader.GetString(ordinal);
Вопрос 5 из 30
Что даёт CommandBehavior.SequentialAccess?
Вопрос 6 из 30
Какой вариант защищает значение email от SQL-инъекции?
C#
command.CommandText = "select id from users where email = @email";
command.Parameters.Add("@email", SqlDbType.NVarChar, 320).Value = email;
Вопрос 7 из 30
Почему AddWithValue иногда ухудшает план?
C#
command.Parameters.AddWithValue("@name", value);
Вопрос 8 из 30
Как передать NULL в ADO.NET parameter?
C#
parameter.Value = middleName is null ? DBNull.Value : middleName;
Вопрос 9 из 30
Можно ли параметризовать ORDER BY @column?
Вопрос 10 из 30
Как безопасно строить LIKE по пользовательскому фрагменту?
C#
command.CommandText = "select name from products where name like @pattern escape '~'";
command.Parameters.Add("@pattern", SqlDbType.NVarChar, 200).Value =
    "%" + EscapeLike(term, '~') + "%";
Вопрос 11 из 30
Что произойдёт, если command.Transaction не задана при активной локальной транзакции connection?
C#
await using var tx = await connection.BeginTransactionAsync(token);
command.Connection = connection;
await command.ExecuteNonQueryAsync(token);
Вопрос 12 из 30
Когда вызывать Commit?
C#
await using var transaction = await connection.BeginTransactionAsync(token);
await SaveA(connection, transaction, token);
await SaveB(connection, transaction, token);
await transaction.CommitAsync(token);
Вопрос 13 из 30
Почему HTTP-вызов внутри DB-транзакции рискован?
Вопрос 14 из 30
Что даёт savepoint?
C#
await tx.SaveAsync("before_optional", token);
try { await ApplyOptionalAsync(connection, tx, token); }
catch { await tx.RollbackAsync("before_optional", token); }
Вопрос 15 из 30
Что означает потеря соединения во время Commit?
Вопрос 16 из 30
Когда AsNoTracking уместен?
C#
var rows = await db.Orders
    .AsNoTracking()
    .Where(o => o.CreatedAt >= from)
    .Select(o => new OrderRow(o.Id, o.Total))
    .ToListAsync(token);
Вопрос 17 из 30
Что такое N+1?
C#
var customers = await db.Customers.ToListAsync(token);
foreach (var customer in customers)
    Console.WriteLine(customer.Orders.Count); // lazy loading может дать N дополнительных запросов
Вопрос 18 из 30
Почему Include не всегда лучший ответ на N+1?
Вопрос 19 из 30
Когда raw SQL оправдан?
C#
var rows = await db.Database.SqlQuery<OrderTotal>($"""
    select customer_id as CustomerId, sum(total) as Total
    from orders where created_at >= {from}
    group by customer_id
    """).ToListAsync(token);
Вопрос 20 из 30
Почему возвращать IQueryable из доменного репозитория спорно?
Вопрос 21 из 30
Почему EF InMemory не заменяет реляционный интеграционный тест?
C#
await using var db = CreateContextWithRealRelationalProvider();
await db.Database.MigrateAsync();
var result = await repository.QueryAsync(token);
Вопрос 22 из 30
Как проверить rollback при ошибке второго шага?
C#
await Assert.ThrowsAsync<RuleException>(() => sut.TransferAsync(command));
await using var verify = CreateDbContext();
Assert.Equal(originalBalance, await verify.Accounts
    .Where(a => a.Id == sourceId).Select(a => a.Balance).SingleAsync());
Вопрос 23 из 30
Что полезно получить из command interceptor?
Вопрос 24 из 30
Как тестировать проблему пула соединений?
C#
var cs = baseCs + ";Max Pool Size=5";
var tasks = Enumerable.Range(0, 100).Select(_ => sut.QueryAsync(cs));
await Task.WhenAll(tasks);
Assert.Equal(0, metrics.ConnectionLeaks);
Вопрос 25 из 30
Зачем сохранять план выполнения тяжёлого запроса?
Вопрос 26 из 30
Что обычно даёт больший выигрыш для массовой вставки?
C#
await bulkCopy.WriteToServerAsync(reader, token);
Вопрос 27 из 30
Зачем outbox?
Вопрос 28 из 30
Когда read replica полезна?
Вопрос 29 из 30
Почему index на каждую колонку вреден?
C#
// Запрос фильтрует tenant_id и created_at, сортирует created_at.
// Кандидат: (tenant_id, created_at) INCLUDE (total), а не два случайных одиночных индекса.
Вопрос 30 из 30
Когда CQRS оправдан?

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу