Я спробував наступний експеримент і отримав подібні результати. В обох випадках fn_dblog () показує, що відбувається відкат, і, здається, це відбувається швидше в сценарії 2, ніж у сценарії 1.
До речі, я розмістив і MDF, і LDF на одному і тому ж зовнішньому (USB 2.0) диску.
Мій початковий висновок полягає в тому, що в цій справі немає різниці в роботі відкату, і, ймовірно, будь-яка видима різниця швидкостей пов'язана з підсистемою вводу / виводу. Це лише моя робоча гіпотеза на даний момент.
Сценарій 1:
- Створіть базу даних з файлом журналу, який починається на 1МБ, зростає в 4МБ шматки і має максимальний розмір 100МБ.
- Відкрийте явну транзакцію, запустіть її протягом 10 секунд, а потім вручну скасуйте її в рамках SSMS
- Подивіться на підрахунок fn_dblog () та розмір резерву журналу та перевірте DBCC SQLPERF (LOGSPACE)
Сценарій 2:
- Створіть базу даних з файлом журналу, який починається на 1МБ, зростає в 4МБ шматки і має максимальний розмір 100МБ.
- Відкрийте явну транзакцію, виконайте її, поки в журналі не з’явиться повна помилка
- Подивіться на підрахунок fn_dblog () та розмір резерву журналу та перевірте DBCC SQLPERF (LOGSPACE)
Результати монітора ефективності:
Сценарій 1:
Сценарій 2:
Код:
ВИКОРИСТАННЯ [майстер];
ПОВЕРНУТИСЯ
ЯКЩО DATABASEPROPERTYEX (N'SampleDB ', N'Version')> 0
ПОЧАТОК
ALTER DATABASE [SampleDB] SET SINGLE_USER
З ПОВЕРНЕНОЮ НЕЗАДАЧНОЮ;
DROP DATABASE [SampleDB];
КІНЧ;
ПОВЕРНУТИСЯ
СТВОРИТИ ДАННУ [SampleDB] НА ПЕРШИЧНІЙ
(
NAME = N'SampleDB '
, FILENAME = N'E: \ data \ SampleDB.mdf '
, SIZE = 3 Мб
, FILEGROWTH = 1 Мб
)
ЗАЛОГІНИТИСЯ
(
NAME = N'SampleDB_log '
, FILENAME = N'E: \ data \ SampleDB_log.ldf '
, SIZE = 1 Мб
, MAXSIZE = 100 Мб
, FILEGROWTH = 4 Мб
);
ПОВЕРНУТИСЯ
USE [SampleDB];
ПОВЕРНУТИСЯ
- Додайте таблицю
СТВОРИТИ СТОЛЮ dbo.test
(
c1 CHAR (8000) НЕ НЕЗАЄМНЕ ЗАМОВЛЕННЯ ('a', 8000)
) НА [ПЕРШИЙ];
ПОВЕРНУТИСЯ
- Переконайтесь, що ми не є псевдопростою моделлю відновлення
РЕЗУЛЬТАТА ДАТАБАЗА зразокDB
ДИСК = 'NUL';
ПОВЕРНУТИСЯ
- Резервне копіювання файлу журналу
BACKUP LOG SampleDB
ДИСК = 'NUL';
ПОВЕРНУТИСЯ
- Перевірте використаний простір журналу
DBCC SQLPERF (LOGSPACE);
ПОВЕРНУТИСЯ
- Скільки записів видно з fn_dblog ()?
ВИБІР * ВІД fn_dblog (NULL, NULL); - Близько 9 у моєму випадку
/ **********************************
СЦЕНАРІЯ 1
********************************** /
- Відкрийте нову транзакцію і потім поверніть її назад
ПОЧАТОК ТРАНЗАКЦІЯ
ВСТАВЛЯЄТЬСЯ в dbo.test ЗАМЕЧАННІ ЦІННОСТІ;
GO 10000 - Нехай запускається протягом 10 секунд, а потім натисніть кнопку Скасувати у вікні запитів SSMS
- Скасувати транзакцію
- На закінчення має пройти пару секунд
- Не потрібно відмовляти транзакцію, оскільки скасування вже зробило це для вас.
- Просто спробуйте. Ви отримаєте цю помилку
- Msg 3903, рівень 16, стан 1, рядок 1
- Запит ROSLBACK TRANSACTION не має відповідного BEGIN TRANSACTION.
РОЗВ'ЯЗАННЯ ТРАНЗАКЦІЯ;
- Який використаний простір журналу? Вище 100%.
DBCC SQLPERF (LOGSPACE);
ПОВЕРНУТИСЯ
- Скільки записів видно з fn_dblog ()?
ВИБІР *
ВІД fn_dblog (NULL, NULL); - Близько 91 926 у моєму випадку
- Загальний запас журналу, показаний fn_dblog ()?
SELECT SUM ([Резерв журналу]) AS [Загальний резерв журналу]
ВІД fn_dblog (NULL, NULL); - Близько 88,72 Мб
/ **********************************
СЦЕНАРІЯ 2
********************************** /
- Здуйте БД і почніть спочатку
ВИКОРИСТАННЯ [майстер];
ПОВЕРНУТИСЯ
ЯКЩО DATABASEPROPERTYEX (N'SampleDB ', N'Version')> 0
ПОЧАТОК
ALTER DATABASE [SampleDB] SET SINGLE_USER
З ПОВЕРНЕНОЮ НЕЗАДАЧНОЮ;
DROP DATABASE [SampleDB];
КІНЧ;
ПОВЕРНУТИСЯ
СТВОРИТИ ДАННУ [SampleDB] НА ПЕРШИЧНІЙ
(
NAME = N'SampleDB '
, FILENAME = N'E: \ data \ SampleDB.mdf '
, SIZE = 3 Мб
, FILEGROWTH = 1 Мб
)
ЗАЛОГІНИТИСЯ
(
NAME = N'SampleDB_log '
, FILENAME = N'E: \ data \ SampleDB_log.ldf '
, SIZE = 1 Мб
, MAXSIZE = 100 Мб
, FILEGROWTH = 4 Мб
);
ПОВЕРНУТИСЯ
USE [SampleDB];
ПОВЕРНУТИСЯ
- Додайте таблицю
СТВОРИТИ СТОЛЮ dbo.test
(
c1 CHAR (8000) НЕ НЕЗАЄМНЕ ЗАМОВЛЕННЯ ('a', 8000)
) НА [ПЕРШИЙ];
ПОВЕРНУТИСЯ
- Переконайтесь, що ми не є псевдопростою моделлю відновлення
РЕЗУЛЬТАТА ДАТАБАЗА зразокDB
ДИСК = 'NUL';
ПОВЕРНУТИСЯ
- Резервне копіювання файлу журналу
BACKUP LOG SampleDB
ДИСК = 'NUL';
ПОВЕРНУТИСЯ
- Тепер підірвемо файл журналу в межах нашої транзакції
ПОЧАТОК ТРАНЗАКЦІЯ
ВСТАВЛЯЄТЬСЯ в dbo.test ЗАМЕЧАННІ ЦІННОСТІ;
GO 10000
- Відкат ніколи не спрацьовує. Спробуй це. Ви отримаєте помилку.
- Msg 3903, рівень 16, стан 1, рядок 1
- Запит ROSLBACK TRANSACTION не має відповідного BEGIN TRANSACTION.
РОЗВ'ЯЗАННЯ ТРАНЗАКЦІЯ;
- Чи заповнений файл журналу на 100%?
DBCC SQLPERF (LOGSPACE);
- Скільки записів видно з fn_dblog ()?
ВИБІР *
ВІД fn_dblog (NULL, NULL); - Близько 91 926 у моєму випадку
ПОВЕРНУТИСЯ
- Загальний запас журналу, показаний fn_dblog ()?
SELECT SUM ([Резерв журналу]) AS [Загальний резерв журналу]
ВІД fn_dblog (NULL, NULL); - 88,72 Мб
ПОВЕРНУТИСЯ