
|
If you were logged in you would be able to see more operations.
|
|
|
|
Environment:
|
Windows 7, Win2008, Win2008R2, FB 2.5 SuperClassic Instance, FB 2.5 and 2.1.3 Classic Instance
|
|
|
1. We have some table TABLE1 contains one column ID (int)
2. Open 2 connections in different threads
3. Connection 1 - select some data from TABLE1, then close
4. Connection 2 - changes structure of TABLE1 adding column COL_1 (any type)
5. Connection 1 (open new)
6. Connection 2 - close
7. Connection 1 - insert data in TABLE1, gets error
Here is sample Code for console application:
using System;
using System.Collections.Generic;
using System.Text;
using FirebirdSql.Data.FirebirdClient;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static FbConnectionStringBuilder fbcs;
static FbConnection cn1;
static FbConnection cn2;
static ManualResetEvent e1 = new ManualResetEvent(false);
static ManualResetEvent e2 = new ManualResetEvent(false);
static ManualResetEvent e3 = new ManualResetEvent(false);
static void Main(string[] args)
{
fbcs = new FbConnectionStringBuilder();
fbcs.ServerType = FbServerType.Default;
fbcs.Database = @"C:\Temp\base.fdb"; //Path to sample DB
fbcs.DataSource = "localhost";
fbcs.Dialect = 3;
fbcs.UserID = "SYSDBA";
fbcs.Password = "masterkey";
ThreadPool.QueueUserWorkItem(new WaitCallback(StartConnectionOne));
ThreadPool.QueueUserWorkItem(new WaitCallback(DoInThread));
Thread.Sleep(1000);
e1.Set();
Console.Read();
}
static void StartConnectionOne(object state)
{
cn1 = new FbConnection(fbcs.ConnectionString);
cn1.Open();
e2.WaitOne();
using (var cmd = cn1.CreateCommand())
{
cmd.Transaction = cn1.BeginTransaction();
try
{
Console.WriteLine("Alter");
cmd.CommandText = "alter table TABLE1 add COL_1 varchar(255)";
cmd.ExecuteNonQuery();
cmd.Transaction.Commit();
Console.WriteLine("Alter success");
}
catch (Exception ex)
{
Console.WriteLine("Alter error: " + ex.Message);
cmd.Transaction.Rollback();
}
}
e3.Set();
}
static void DoInThread(object state)
{
cn2 = new FbConnection(fbcs.ConnectionString);
cn2.Open();
e1.WaitOne();
using (var cmd = cn2.CreateCommand())
{
try
{
Console.WriteLine("Select 1");
cmd.CommandText = "select * from TABLE1 order by ID";
using (var r = cmd.ExecuteReader())
{
while (r.Read())
{
Console.WriteLine(r.ToString());
}
}
Console.WriteLine("Select 1 success");
}
catch (Exception ex)
{
Console.WriteLine("Select 1 error: " + ex.Message);
}
}
cn2.Close();
cn2.Dispose();
e2.Set();
e3.WaitOne();
cn2 = new FbConnection(fbcs.ConnectionString);
cn2.Open();
cn1.Close();
cn1.Dispose();
using (var cmd = cn2.CreateCommand())
{
try
{
Console.WriteLine("Select 2");
cmd.CommandText = "select * from TABLE1 order by COL_1";
using (var r = cmd.ExecuteReader())
{
while (r.Read())
{
Console.WriteLine(r.ToString());
}
}
Console.WriteLine("Select 2 success");
}
catch (Exception ex)
{
Console.WriteLine("Select 2 error: " + ex.Message);
}
}
using (var cmd = cn2.CreateCommand())
{
cmd.Transaction = cn2.BeginTransaction();
try
{
Console.WriteLine("Insert");
cmd.CommandText = "insert into TABLE1 (ID, COL_1) Values (1, '1234')";
cmd.ExecuteNonQuery();
cmd.Transaction.Commit();
Console.WriteLine("Insert success");
}
catch (Exception ex)
{
Console.WriteLine("Insert error: " + ex.Message);
cmd.Transaction.Rollback();
}
}
}
}
}
|
|
Description
|
1. We have some table TABLE1 contains one column ID (int)
2. Open 2 connections in different threads
3. Connection 1 - select some data from TABLE1, then close
4. Connection 2 - changes structure of TABLE1 adding column COL_1 (any type)
5. Connection 1 (open new)
6. Connection 2 - close
7. Connection 1 - insert data in TABLE1, gets error
Here is sample Code for console application:
using System;
using System.Collections.Generic;
using System.Text;
using FirebirdSql.Data.FirebirdClient;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static FbConnectionStringBuilder fbcs;
static FbConnection cn1;
static FbConnection cn2;
static ManualResetEvent e1 = new ManualResetEvent(false);
static ManualResetEvent e2 = new ManualResetEvent(false);
static ManualResetEvent e3 = new ManualResetEvent(false);
static void Main(string[] args)
{
fbcs = new FbConnectionStringBuilder();
fbcs.ServerType = FbServerType.Default;
fbcs.Database = @"C:\Temp\base.fdb"; //Path to sample DB
fbcs.DataSource = "localhost";
fbcs.Dialect = 3;
fbcs.UserID = "SYSDBA";
fbcs.Password = "masterkey";
ThreadPool.QueueUserWorkItem(new WaitCallback(StartConnectionOne));
ThreadPool.QueueUserWorkItem(new WaitCallback(DoInThread));
Thread.Sleep(1000);
e1.Set();
Console.Read();
}
static void StartConnectionOne(object state)
{
cn1 = new FbConnection(fbcs.ConnectionString);
cn1.Open();
e2.WaitOne();
using (var cmd = cn1.CreateCommand())
{
cmd.Transaction = cn1.BeginTransaction();
try
{
Console.WriteLine("Alter");
cmd.CommandText = "alter table TABLE1 add COL_1 varchar(255)";
cmd.ExecuteNonQuery();
cmd.Transaction.Commit();
Console.WriteLine("Alter success");
}
catch (Exception ex)
{
Console.WriteLine("Alter error: " + ex.Message);
cmd.Transaction.Rollback();
}
}
e3.Set();
}
static void DoInThread(object state)
{
cn2 = new FbConnection(fbcs.ConnectionString);
cn2.Open();
e1.WaitOne();
using (var cmd = cn2.CreateCommand())
{
try
{
Console.WriteLine("Select 1");
cmd.CommandText = "select * from TABLE1 order by ID";
using (var r = cmd.ExecuteReader())
{
while (r.Read())
{
Console.WriteLine(r.ToString());
}
}
Console.WriteLine("Select 1 success");
}
catch (Exception ex)
{
Console.WriteLine("Select 1 error: " + ex.Message);
}
}
cn2.Close();
cn2.Dispose();
e2.Set();
e3.WaitOne();
cn2 = new FbConnection(fbcs.ConnectionString);
cn2.Open();
cn1.Close();
cn1.Dispose();
using (var cmd = cn2.CreateCommand())
{
try
{
Console.WriteLine("Select 2");
cmd.CommandText = "select * from TABLE1 order by COL_1";
using (var r = cmd.ExecuteReader())
{
while (r.Read())
{
Console.WriteLine(r.ToString());
}
}
Console.WriteLine("Select 2 success");
}
catch (Exception ex)
{
Console.WriteLine("Select 2 error: " + ex.Message);
}
}
using (var cmd = cn2.CreateCommand())
{
cmd.Transaction = cn2.BeginTransaction();
try
{
Console.WriteLine("Insert");
cmd.CommandText = "insert into TABLE1 (ID, COL_1) Values (1, '1234')";
cmd.ExecuteNonQuery();
cmd.Transaction.Commit();
Console.WriteLine("Insert success");
}
catch (Exception ex)
{
Console.WriteLine("Insert error: " + ex.Message);
cmd.Transaction.Rollback();
}
}
}
}
}
|
Show » |
|