Вставка в две таблицы с транзакцией SQL
Как реализовать код вставки из двух таблиц с помощью транзакции SQL на внешнем интерфейсе?
У меня есть две таблицы, TblMaster
а также TblSub
, Если Tblsub
вставить не удастся, то TblMaster
запись должна быть откачена.
У меня есть общая функция ExecuteNonQuery
в классе помощника SQL для вставки записей.
Пожалуйста, предложите мне способ решить эту проблему.
3 ответа
Пример в C#
SqlTransaction transaction = null;
SqlConnection con = null;
// they will be used to decide whether to commit or rollback the transaction
bool debitResult = false;
bool creditResult = false;
try
{
con = new SqlConnection(CONNECTION_STRING);
con.Open();
// lets begin a transaction here
transaction = con.BeginTransaction();
// Let us do a debit first
using (SqlCommand cmd = con.CreateCommand())
{
cmd.CommandType = CommandType.Text;
cmd.CommandText = "Insert into Table1"; // Query here
// assosiate this command with transaction
cmd.Transaction = transaction;
debitResult = cmd.ExecuteNonQuery() == 1;
}
// A dummy throw just to check whether the transaction are working or not
//throw new Exception("Let see..."); // uncomment this line to see the transaction in action
// And now do a credit
using (SqlCommand cmd = con.CreateCommand())
{
cmd.CommandType = CommandType.Text;
cmd.CommandText = "Insert into Table2"; // Query here
// assosiate this command with transaction
cmd.Transaction = transaction;
creditResult = cmd.ExecuteNonQuery() == 1;
}
if (debitResult && creditResult)
{
transaction.Commit();
}
}
catch
{
transaction.Rollback();
}
finally
{
con.Close();
}
Попробуй так
BEGIN TRANSACTION tran1
BEGIN TRY
--Insert into Table1
--Insert into Table2
COMMIT TRANSACTION tran1
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION tran1
raiserror('Cannot commite transaction',16,1,@@error);
return;
END CATCH
Используйте область транзакции, как это (вам нужно сослаться на System.Transactions
Библиотека.NET в вашем проекте с помощью пункта меню "Добавить ссылку"):
using (TransactionScope scope = new TransactionScope())
{
using (SqlConnection conn = new SqlConnection(<connectionString>))
{
conn.Open()
try
{
// Do your stuff
...
// Commit the transaction
scope.Complete();
}
catch (...)
{
// Handle exceptions, transaction is rolled back automatically, as
// "Complete" was not called
}
}
}