Ватсон Карли
Шрифт:
public Purchase { }
public bool PlaceOrder(bool CommitTrans) {
// Попытка работы
try {
if (CommitTrans) {
// Эта транзакция должна быть зафиксирована
// шаг 1 - Увеличить число единиц продукта ID=2 на 10
IncreaseUnits(2, 10);
// шаг 2 - Сократить запас продукта ID=2 на 10 единиц
ReduceStock(2, 10);
} else {
// Эта транзакция должна быть отменена
// шаг 3 — Увеличить число единиц продукта ID=5 на 5
IncreaseUnits(5, 5);
// шаг 2 — Сократить запас продукта ID=5 на 5
единиц ReduceStock(5, 5);
}
// Если все прошло хорошо, закончить транзакцию.
ContextUtil.SetComplete;
return true;
}
// Этот код выполняется, если встречается ошибка.
catch (Exception e) {
// Отменить работу, которую выполнила эта функция.
ContextUtil.SetAbort;
return false;
}
}
public void ReduceStock(int ProductID, int amount) {
string source = "server ephemeral;uid=sa;pwd=garysql;database Northwind";
SqlConnection conn = new SqlConnection(source);
string command =
"UPDATE Products SET UnitsInStock = UnitsInStock - " +
amount.ToString + " WHERE ProductID = " + ProductID.ToString;
conn.Open;
sqlCommand cmd = new SqlCommand(command, conn);
cmd.ExecuteNonQuery;
conn.Close;
}
public void IncreaseUnits(int ProductID, int amount) {
string source = "server=ephemeral;uid=sa;pwd=garysql;database=Northwind";
SqlConnection conn = new SqlConnection(source);
string command =
"UPDATE Products SET UnitsOnOrder = UnitsOnOrder +
" amount.ToString + " WHERE ProductID = " + ProductID.ToString;
conn.Open;
SqlCommand cmd = new SqlCommand(command, conn);
cmd.ExecuteNonQuery;
conn.Close;
}
public void Restore {
// Восстановить запас продукта ID=2
ReduceStock(2, -10);
// Восстановить единицы продукта для ID=2
IncreaseUnits(2, -10);
// Не требуется восстанавливать запас или единицы продукта для ID=5,
// так так транзакция должна быть отменена
}
}
}
Можно создать клиента для тестирования этой библиотеки классов. Здесь клиент создан так, что он ожидает, пока пользователь проверит содержимое базы данных, прежде чем восстановить базу данных в исходное состояние. Это позволяет увидеть результаты транзакций.
statiс void Main(string[] args) {
Purchase order = new Purchase;
Console.WriteLine("\nThis transaction should commit");
Console.WriteLine("ProductID = 2, ordering 10 items");
if (Order.PlaceOrder(true)) Console.WriteLine("Transaction Successful");
else Console.WriteLine("Transaction Unsuccessful");
Console.WriteLine("\nThis transaction should roll back");
Console.WriteLine("ProductID = 5, ordering 5 items");
if (Order.PlaceOrder(false)) Console.WriteLine("Transaction Successful");
else Console.WriteLine("Transaction Unsuccessful");
Console.WriteLine(