एक पिछले लेनदेन में वापस रोलिंग विफलता के मामले में लेनदेन और में चेक बाधा जोड़ने का कोई तरीका है (पूरे लेनदेन को वापस करने की बजाय) ?असफल तालिका में विफलता पर रोलबैक लेनदेन ... कंसस्ट्रेंट
मेरे मामले में, जब एक वैकल्पिक तालिका ... कंसस्ट्रेंट कमांड जोड़ें विफल रहता है, तो लेनदेन को वापस सहेजने के लिए वापस नहीं किया जा सकता है (ऐसा करने का प्रयास अमान्यऑपरेशन अपवाद को फेंकता है)।
अवलोकन प्रदर्शित करने के लिए महत्वपूर्ण बिंदु:
SqlTransaction transaction = connection.BeginTransaction();
// ... execute SQL commands on the transaction ...
// Create savepoint
transaction.Save("mySavepoint");
try
{
// This will fail...
SqlCommand boom = new SqlCommand(
"ALTER TABLE table WITH CHECK ADD CONSTRAINT ...",
connection,
transaction);
boom.ExecuteNonQuery();
}
catch
{
// ...and should be rolled back to the savepoint, but can't.
try
{
transaction.Rollback("mySavepoint");
}
catch (InvalidOperationException)
{
// Instead, an InvalidOperationException is thrown.
// The transaction is unusable and can only be rolled back entirely.
transaction.Rollback();
}
}
और यहाँ रेडी-टू-चलाने डेमो कोड (यदि आप एक datase नामित "परीक्षण" की जरूरत है) का परीक्षण करने के लिए:
public class Demo
{
private const string _connectionString = "Data Source=(local);Integrated security=true;Initial Catalog=test;";
private const string _savepoint = "save";
private static readonly string _tableName = DateTime.Now.ToString("hhmmss");
private static readonly string _constraintName = "CK" + DateTime.Now.ToString("hhmmss");
private static readonly string _createTable = "CREATE TABLE [dbo].[" + _tableName + "] ([one] [int] NULL,[two] [int] NULL) ON [PRIMARY]";
private static readonly string _insert1 = "INSERT INTO [" + _tableName + "] VALUES (1,1)";
private static readonly string _addConstraint = "ALTER TABLE [dbo].[" + _tableName + "] WITH CHECK ADD CONSTRAINT [" + _constraintName + "] CHECK (([one]>(1)))";
private static readonly string _insert2 = "INSERT INTO [" + _tableName + "] VALUES (2,2)";
public static void Main(string[] args)
{
// Example code! Please ignore missing using statements.
SqlConnection connection = new SqlConnection(_connectionString);
connection.Open();
SqlTransaction transaction = connection.BeginTransaction();
SqlCommand createTable = new SqlCommand(_createTable, connection, transaction);
createTable.ExecuteNonQuery();
// Create savepoint
transaction.Save(_savepoint);
SqlCommand insert1 = new SqlCommand(_insert1, connection, transaction);
insert1.ExecuteNonQuery();
try
{
// This will fail...
SqlCommand boom = new SqlCommand(_addConstraint, connection, transaction);
boom.ExecuteNonQuery();
}
catch
{
// ...and should be rolled back to the savepoint, but can't
transaction.Rollback(_savepoint);
}
SqlCommand insert2 = new SqlCommand(_insert2, connection, transaction);
insert2.ExecuteNonQuery();
transaction.Commit();
connection.Close();
}
}
जब मैं पूरी तरह से टीएसक्यूएल में कोशिश करता हूं तो मुझे त्रुटि मिलती है "वर्तमान लेनदेन को प्रतिबद्ध नहीं किया जा सकता है और इसे एक सेवपॉइंट पर वापस नहीं लाया जा सकता है। पूरे लेनदेन को वापस रोल करें।" - बस बर्बाद लेनदेन पर पढ़ना। –
कोई दस्तावेज नहीं मिला जो स्पष्ट रूप से बताता है कि कौन सी त्रुटियां लेनदेन को समाप्त कर रही हैं (या असामान्य प्रदान की जाती है) लेकिन यह त्रुटि स्पष्ट रूप से उनमें से एक प्रतीत होती है! –
वास्तव में, उस विषय पर विशिष्ट दस्तावेज की कमी लगभग कष्टप्रद है। – nodots