powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Многопоточность и Entity Framework - почему возникают очереди?
17 сообщений из 17, страница 1 из 1
Многопоточность и Entity Framework - почему возникают очереди?
    #38121407
ProgED
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть приложение, которое в нескольких потоках обращается к одной БД MS SQL с помощью Entity Framework. Экземпляры контекста создаются новые - каждый в своем потоке.

Почему обращения к БД становятся в очередь?

Кто-нибудь сталкивался с такой проблемой?
...
Рейтинг: 0 / 0
Многопоточность и Entity Framework - почему возникают очереди?
    #38121470
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProgED,

Читаете/пишете? Что за БД? Кусок схемы данных? Лог трассировки запросов и параметров, которые сыплются в БД?
...
Рейтинг: 0 / 0
Многопоточность и Entity Framework - почему возникают очереди?
    #38121680
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда ты вызываешь ctx.SaveChanges(), то происходит примерно то, что под spoiler'ом.

Например
таблица 
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE [dbo].[t2](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[name] [nvarchar](20) NULL,
 CONSTRAINT [PK_t2] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
using System;
using System.Collections.Generic;
using System.Data.Entity.Infrastructure;
using System.Data.Objects;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;

namespace ConsoleApplication24
{
    class Program
    {
        static void Main(string[] args)
        {
            #region Первый поток меняет запись с Id = 1
            using (var tx1 = new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
            {
                using (var ctx1 = new DB1Entities())
                {
                    var t1 = ctx1.t2.FirstOrDefault(t => t.id == 1);
                    t1.name = "zzz1";

                    ((IObjectContextAdapter)ctx1).ObjectContext.SaveChanges(SaveOptions.DetectChangesBeforeSave);

                    #region А в это время второй поток запрашивает/меняет Id = 1
                    using (var tx2 = new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
                    {
                        using (var ctx2 = new DB1Entities())
                        {
                            // Если MS SQL в роли блокировочника, то повиснет здесь до коммита транзакции tx1
                            var t2 = ctx2.t2.FirstOrDefault(t => t.id == 1);
                            t2.name = "zzz2";

                            // Если MS SQL в роли версионника, то может повиснуть здесь до коммита транзакции tx1
                            ((IObjectContextAdapter)ctx2).ObjectContext.SaveChanges(SaveOptions.DetectChangesBeforeSave);

                            tx2.Complete();
                            ((IObjectContextAdapter)ctx2).ObjectContext.AcceptAllChanges();
                        }
                    }
                    #endregion

                    tx1.Complete();
                    ((IObjectContextAdapter)ctx1).ObjectContext.AcceptAllChanges();
                }

            }
            #endregion

        }
    }
}

...
Рейтинг: 0 / 0
Многопоточность и Entity Framework - почему возникают очереди?
    #38121690
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Криво вставилось.
...
Рейтинг: 0 / 0
Многопоточность и Entity Framework - почему возникают очереди?
    #38121895
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сперва в голове всплыло.. что гдето попадалась информация... что ADO в один момент времени выполняет один запрос.. но не тут-то было
ради любопытства накидал, форма с двумя баттонами, два запроса, первый очень долгий

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
        private void button2_Click(object sender, EventArgs e)
        {
            new Thread(delegate()
            {
                using (SqlConnection conn = new SqlConnection(ConnectionString))
                {
                    conn.Open();
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = conn;
                    cmd.CommandType = CommandType.Text;
                    cmd.CommandText = "waitfor delay '00:00:30'; select 1";
                    SqlDataReader reader = cmd.ExecuteReader();
                    conn.Close();
                    MessageBox.Show("Query one is done");
                }

            }).Start();

        }

        private void button3_Click(object sender, EventArgs e)
        {
            using (SqlConnection conn = new SqlConnection(ConnectionString))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = " select 2";
                SqlDataReader reader = cmd.ExecuteReader();
                conn.Close();
                MessageBox.Show("Query two is done");
            }
        }


результат теста - пока выполняется первый, без проблем вызывается второй
вывод.. ADO.Net справляется с одновременными запросами из разных потоков

потом попробовал такой вот вариант
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
        public Form1()
        {
            InitializeComponent();
            conn.Open();
        }
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            conn.Close();
        }
        SqlConnection conn = new SqlConnection(@"data source=....");

        private void button2_Click(object sender, EventArgs e)
        {
            new Thread(delegate()
            {
                //using (SqlConnection conn = new SqlConnection(ConnectionString))
                {
                    //conn.Open();
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = conn;
                    cmd.CommandType = CommandType.Text;
                    cmd.CommandText = "waitfor delay '00:00:30'; select 1";
                    SqlDataReader reader = cmd.ExecuteReader();
                    //conn.Close();
                    MessageBox.Show("Query one is done");
                }

            }).Start();

        }

        private void button3_Click(object sender, EventArgs e)
        {
            //using (SqlConnection conn = new SqlConnection(ConnectionString))
            {
                //conn.Open();
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = " select 2";
                SqlDataReader reader = cmd.ExecuteReader();
                //conn.Close();
                MessageBox.Show("Query two is done");
            }
        }



квери ту заткнулся пока не выполнился квери уан )
для паралельных запросов нужны разные connection

такой вот эксперимент )
...
Рейтинг: 0 / 0
Многопоточность и Entity Framework - почему возникают очереди?
    #38121966
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кифирчик,

Экземплярные члены SqlConnection не потокобозопасены. Сам SqlConnection представляет собой соединение с базой, потому команды в пределах разных Connection отсылаются к БД независимо.

Эти запросы из примера не конкурируют за ресурсы.

Код: sql
1.
waitfor delay '00:00:30'; select 1


Код: sql
1.
select 1



У автора, скорее всего конкуренция писателей или писателей/читателей на уровне БД (автор найдет ответ при чтении transactions, isolation levels, blocking/versioning mode и т. п..).
...
Рейтинг: 0 / 0
Многопоточность и Entity Framework - почему возникают очереди?
    #38122030
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lord British,
Возможно, я привел пример для "информации". И он показывает, что если в разных потоках юзается один Connection то запросы встанут в очередь. Факт. Не использую Entity FrameWork, и не знаю его внутренностей, по этому не буду настаивать что причина 100% в этом, но такая вероятность есть. ИМХО.

авторУ автора, скорее всего конкуренция писателей или писателей/читателей на уровне БД (автор найдет ответ при чтении transactions, isolation levels, blocking/versioning mode и т. п..).
Возможно, но я сильно сомневаюсь что у автора эта проблема на продакшене всплыла, с.. этак сотней пользователей, и кто-то что-то там залочил. Скорей всего запускает на "машине девелопера", 1..2 коннекта... в таком случае попасться на блокировку ресурсов... надо очень много граблей разложить ))))
Хотя опять же, не знаю, возможно они уже разложены c помощью Entity и автор не учел извилистого пути между создавая программу)
ИМХО )
...
Рейтинг: 0 / 0
Многопоточность и Entity Framework - почему возникают очереди?
    #38122130
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кифирчик,

КифирчикВозможно, я привел пример для "информации". И он показывает, что если в разных потоках юзается один Connection то запросы встанут в очередь.


Нельзя этого делать - не потокобезопасно.

Кифирчикпо этому не буду настаивать что причина 100% в этом, но такая вероятность есть. ИМХО.


У автора

ProgEDЕсть приложение, которое в нескольких потоках обращается к одной БД MS SQL с помощью Entity Framework. Экземпляры контекста создаются новые - каждый в своем потоке.


Можешь считать, что по отдельному SqlConnection на каждый поток.

Кифирчикпо этому не буду настаивать что причина 100% в этом, но такая вероятность есть. ИМХО.


Потому такой вероятности нет. Совсем нет.

КифирчикНе использую Entity FrameWork, и не знаю его внутренностей


В дебрях EF это выглядит так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication26
{
    class Program
    {
        static void Main(string[] args)
        {
            var conStr = @"Data Source=localhost;Initial Catalog=DB2;Integrated Security=True";

            #region 1 поток
            using (var con1 = new SqlConnection(conStr))
            {
                con1.Open();

                using (var tx1 = con1.BeginTransaction(IsolationLevel.ReadCommitted))
                {
                    var sql1 = @"update t2 set name = 'zzz1' where id = 1";
                    using (var cmd1 = con1.CreateCommand())
                    {
                        cmd1.Transaction = tx1;
                        cmd1.CommandText = sql1;
                        cmd1.ExecuteNonQuery();
                    }

                    #region 2 поток конкурирующая запись или чтение
                    using (var con2 = new SqlConnection(conStr))
                    {
                        con2.Open();

                        using (var tx2 = con2.BeginTransaction(IsolationLevel.ReadCommitted))
                        {
                            // var sql2 = @"update t2 set name = 'zzz2' where id = 1";

                            var sql2 = @"select id, name from t2 where id = 1";
                            using (var cmd2 = con2.CreateCommand())
                            {
                                cmd2.Transaction = tx2;
                                cmd2.CommandText = sql2;

                                // Если MSSQL сконфигурирован как блокировочник, то программа повиснет на этой строчке,
                                // до выполнения tx1.Commit() или tx1.RollBack(). Если MS SQL сконфигурирован как 
                                // версионник, то программа продолжит выполнение при текущем уровне изоляции транзакций
                                // IsolationLevel.ReadCommited
                                var reader = cmd2.ExecuteReader();
                                while (reader.Read())
                                    Console.WriteLine("{0} - {1}", reader["Id"], reader["Name"]);

                                // Не зависимо от того, как сконфигурирован MS SQL, если раскомментировать запрос выше (конкурирующий писатель)
                                // то на этой строчке программа повиснет до выполнения tx1.Commit() или tx1.RollBack()
                                // cmd2.ExecuteNonQuery();

                            }

                            tx2.Commit();
                        }
                    }
                    #endregion

                    tx1.Commit();
                }
            }
            #endregion
        }
    }
}



Эта проблема вполне вероятна при

ProgEDЕсть приложение, которое в нескольких потоках обращается к одной БД MS SQL с помощью Entity Framework.


Решение этой проблемы - как минимум, понимание транзакций, уровня изоляций и т. п.. а также правильное проектирование схемы и логики прилодения, чтобы потоки не мешали друг другу. Иначе смысла в них нет.
...
Рейтинг: 0 / 0
Многопоточность и Entity Framework - почему возникают очереди?
    #38122154
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кифирчик,

Сессия 1
Код: sql
1.
2.
3.
4.
5.
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

BEGIN TRANSACTION

UPDATE T2 SET NAME='tran1' WHERE ID = 1;




Сессия 2
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

BEGIN TRANSACTION

UPDATE T2 SET NAME='tran2' WHERE ID = 1;
-- Висит, ждет пока 1 транзакция сделает commit/rollback

SELECT ID, NAME FROM T2 WHERE ID = 1;
-- Висит при блокировочнике, ждет пока 1 транзакция сделает commit/rollback
-- Не висит при версионнике, возвращает данные
...
Рейтинг: 0 / 0
Многопоточность и Entity Framework - почему возникают очереди?
    #38122212
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
почему кстати не запустить профайлер или мониторинг и не посмотреть почему висит?
...
Рейтинг: 0 / 0
Многопоточность и Entity Framework - почему возникают очереди?
    #38122254
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanпочему кстати не запустить профайлер или мониторинг и не посмотреть почему висит?

это мне вопрос? так я знаю почему висит, так СУБД реализует выбранный мной уровень изоляции транзакций при выбранной стратегии поведения блокировочник/версионник. cпециально подобрал примеры, которые скорее всего у автора темы повторяются в его приложении. из-за чего ему и кажется, что

ProgEDПочему обращения к БД становятся в очередь?
...
Рейтинг: 0 / 0
Многопоточность и Entity Framework - почему возникают очереди?
    #38122263
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Многопоточность и Entity Framework - почему возникают очереди?
    #38122283
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок! Проблема скорей всего во взаимоблокировках.. ждемс профайлинга и красивого скрина с блокировками от топик стартера )

авторВ дебрях EF это выглядит так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
...
namespace ConsoleApplication26
{
    class Program
    {
...

                using (var tx1 = con1.BeginTransaction(IsolationLevel.ReadCommitted))
                {
                    var sql1 = @"update t2 set name = 'zzz1' where id = 1";
                    using (var cmd1 = con1.CreateCommand())
                    {
                        cmd1.Transaction = tx1;
                        cmd1.CommandText = sql1;
                        cmd1.ExecuteNonQuery();
                    }
...
                    tx1.Commit();
...


Я правильно понял, что если в Entity сохранять взаимозависимые записи, он нагородит такое вот с транзакциями?
...
Рейтинг: 0 / 0
Многопоточность и Entity Framework - почему возникают очереди?
    #38122316
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КифирчикЯ правильно понял, что если в Entity сохранять взаимозависимые записи, он нагородит такое вот с транзакциями?

КифирчикЯ правильно понял, что если в Entity сохранять взаимозависимые записи, он нагородит такое вот с транзакциями?


DbContext реализует принцип UnitOfWork. Все изменения сделанные в пределах контекста при вызове SaveChanges отправляются в БД в пределах одной транзакции. Не обязательно взаимосвязанные сущности. EF тут поступает правильно. Другое дело, что его, вероятно, использовали там где не стоит.

Подозреваю, у автора что-то типа обработки Entities пачками в потоках с длинными транзакциями и эскалациями блокировок. В итоге картина вроде такой:



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE TABLE [dbo].[t2](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[name] [nvarchar](max) NULL,
 CONSTRAINT [PK_t2] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

INSERT INTO T2(NAME)
SELECT A.NAME
  FROM SYSOBJECTS A
		CROSS JOIN 
	   SYSOBJECTS B
	    CROSS JOIN
	   SYSOBJECTS C




Сессия 1 (обновляем все записи с четным ID в пределах одной транзакции)
Код: sql
1.
2.
3.
4.
5.
6.
7.
SET TRANSACTION ISOLATION LEVEL READ COMMITTED

BEGIN TRAN

UPDATE T2
SET name = 'TRAN1'
WHERE ID % 2 = 0;




Сессия 2 (по идее не конфликтует с сессией 1 см. where, но из-за эскалации блокировок конфликтует)
Код: sql
1.
2.
3.
4.
5.
6.
7.
SET TRANSACTION ISOLATION LEVEL READ COMMITTED

BEGIN TRAN

UPDATE T2
SET name = 'TRAN2'
WHERE ID = 1;



Сессия 3 (какое-нбудь приложение, по той же причине что и сессия 2 ждет освобождения блокировки)
Код: sql
1.
2.
3.
4.
5.
SET TRANSACTION ISOLATION LEVEL READ COMMITTED

BEGIN TRAN

INSERT INTO T2(NAME) VALUES('TRAN3');



Сессия 4 (у меня настроенно, как версионник, потому нет конфликтов, у блокировочников будет ждать как и все остальные сессии, не зависимо пересекаются ли наборы в предикатах с сессией 1)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SET TRANSACTION ISOLATION LEVEL READ COMMITTED

BEGIN TRAN

SELECT ID, NAME
FROM T2
WHERE ID = 11; /* не пересекается с сессией 1*/

SELECT ID, NAME
FROM T2
WHERE ID = 12; /* пересекается с сессией 1*/



...
Рейтинг: 0 / 0
Многопоточность и Entity Framework - почему возникают очереди?
    #38123381
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lord BritishКифирчикЯ правильно понял, что если в Entity сохранять взаимозависимые записи, он нагородит такое вот с транзакциями?

КифирчикЯ правильно понял, что если в Entity сохранять взаимозависимые записи, он нагородит такое вот с транзакциями?


DbContext реализует принцип UnitOfWork. Все изменения сделанные в пределах контекста при вызове SaveChanges отправляются в БД в пределах одной транзакции. Не обязательно взаимосвязанные сущности. EF тут поступает правильно. Другое дело, что его, вероятно, использовали там где не стоит.

он создает явную транзакцию? надо бы посмотреть :)
...
Рейтинг: 0 / 0
Многопоточность и Entity Framework - почему возникают очереди?
    #38123747
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivan,

Если есть Ambient транзакция, то если Enlist в connectionString'e true, учавствует в ней, если false то создает свою.
Если Ambient нету, то создаст свою.

Логично и предсказуемо. Иначе EF был бы бесполезен совсем.

Пруфы:
...
Рейтинг: 0 / 0
Многопоточность и Entity Framework - почему возникают очереди?
    #38123905
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если кому интересно, как в описанной для MS SQL (когда он делает эскалацию) ситуации поведет Oracle. В Oracle эскалации блокировок нет.


The standard level of locking in an Oracle database guarantees the highest possible
level of concurrency. This means that if a session is updating one row, the one row is
locked; nothing else. Furthermore, the row is only locked to prevent other sessions
from updating it—other sessions can read it at any time. The lock is held until the
transaction completes, either with a COMMIT or a ROLLBACK.


Заполняем данными
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
SQL*Plus: Release 11.2.0.1.0 Production on Thu Jan 24 21:09:10 2013

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> create table t1(
  2    id number not null,
  3    name nvarchar2(20),
  4    constraint t1_pk primary key (id) enable
  5  );

Table created.

SQL> insert into t1(id, name)
  2  select level, level from dual connect by level < 100000;

99999 rows created.

SQL> commit;

Commit complete.

SQL>



Сессия 1 (не блокирует сессию 2)
Код: sql
1.
2.
3.
4.
5.
SQL> update t1 set name='TRAN1' where mod(id, 2) = 0;

49999 rows updated.

SQL>



Сессия 2 (не блокирует сессию 1)
Код: sql
1.
2.
3.
4.
5.
SQL> update t1 set name='TRAN1' where mod(id, 2) = 1;

50000 rows updated.

SQL>



В Oracle нет эскалации блокировок в отличие от MS SQL.

To execute DML on rows, a session must acquire exclusive locks on the rows to
be changed, and shared locks on the tables containing the rows. If another session
already has exclusive locks on the rows, the session will hang until the locks are
released by a COMMIT or a ROLLBACK. If another session already has a shared lock
on the table and exclusive locks on other rows, that is not a problem. An exclusive
lock on the table would be, but the default locking mechanism does not lock whole
tables unless this is necessary for DDL statements.


"SPID""ORA""VLOCK""TYPE""LMODE""WAIT""5048""SCOTT""AE""AE""S""""5048""SCOTT""TRANSACTION ROW-LEVEL""DML LOCK""X""""4564""SCOTT""AE""AE""S""""4564""SCOTT""TRANSACTION ROW-LEVEL""DML LOCK""X"""

Две сессии захватили shared блокировку на таблицу и эксклюзивные на свои строки. Никто никому не мешает. Для Oracle блокировка не ресурс в понимании MS SQL в силу различия реализации. MS SQL делает эскалацию не от хорошей жизни, а Oracle можно сказать все равно в данной ситуации.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Многопоточность и Entity Framework - почему возникают очереди?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]