SQL CE Transaction Handling
Update: Yes, I am crazy! Turn out that I forgot to do "command.Transaction = tx;" and then I went and read some outdated documentation, and got the completely wrong picture, yuck! I still think that requiring "command.Transaction = tx;" is bad API design and error prone (duh!).
Someone please tell me that I am not crazy. The output out this program is:
Wrote item
Wrote item
Wrote item
3
Wrote item
Wrote item
4
Wrote item
Wrote item
5
Wrote item
Wrote item
6
Wrote item
This is wrong on so many levels...
public class Program { const string connectionString = "Data Source=test.dsf"; public static void Main(string[] args) { File.Delete("test.dsf"); var engine = new SqlCeEngine(connectionString); engine.CreateDatabase(); using (var connection = new SqlCeConnection(connectionString)) { connection.Open(); SqlCeCommand command = connection.CreateCommand(); command.CommandText = @"CREATE TABLE Test(Id INT IDENTITY PRIMARY KEY, Name NVARCHAR(25) NOT NULL)"; command.ExecuteNonQuery(); } ThreadPool.QueueUserWorkItem(ReadFromDb); using (var connection = new SqlCeConnection(connectionString)) { connection.Open(); using(IDbTransaction tx = connection.BeginTransaction(IsolationLevel.Serializable)) { while(true) { using (SqlCeCommand command = connection.CreateCommand()) { command.CommandText = @"INSERT INTO Test(Name) VALUES('A');"; command.ExecuteNonQuery(); } Console.WriteLine("Wrote item"); Thread.Sleep(500); } } } } private static void ReadFromDb(object state) { Thread.Sleep(1000); using (var connection = new SqlCeConnection(connectionString)) { connection.Open(); using (IDbTransaction tx = connection.BeginTransaction(IsolationLevel.Serializable)) { while (true) { using (SqlCeCommand command = connection.CreateCommand()) { command.CommandText = @"SELECT COUNT(*) FROM Test;"; Console.WriteLine(command.ExecuteScalar()); } Console.WriteLine("Wrote item"); Thread.Sleep(500); } } } } }

Comments
Comment preview