Обнаружение, которое блокирует, которые получены в запросе на SQL Server?

Добавление ответа вместо продолжения в комментариях.

По умолчанию Android будет сохранять состояние вашего пользовательского интерфейса тогда и только тогда, когда вы используете компоненты по умолчанию (имеется в виду TextView, Button, Switch и т. Д.) И у вашего компонента есть идентификатор. Это состояние сохранится только в том случае, если ОС убивает приложение и пользователь возвращается к нему. Это означает, что если пользователь нажмет кнопку Home, а затем вернется к вашему Activity на более позднем этапе, состояние пользовательского интерфейса всех компонентов по умолчанию этого конкретного Activity будет восстановлено. При нажатии кнопки Home Activity останавливается и вызывается onSaveInstanceState, поэтому здесь у вас есть возможность сохранить любое состояние, которое не поддерживается компонентами по умолчанию, или если у вас есть данные, которые вы скачали, например, используется для заполнения ваших компонентов пользовательского интерфейса данными.

Если пользователь нажмет кнопку Back, приложение будет убито, и любое состояние пользовательского интерфейса не будет восстановлено по умолчанию. Чтобы преодолеть это, вы можете использовать SharedPreferences или любой другой механизм локального хранилища для хранения вашего пользовательского интерфейса на диске.

Я добавил фрагмент кода, который показывает, как вы можете использовать разные подходы.

В вашем случае вам не нужна реализация метода onSaveInstanceState, поскольку у вас есть компонент пользовательского интерфейса по умолчанию, который уже знает, как сохранить свое собственное состояние, и, как уже упоминалось, Android уже делает это автоматически для вас.

Оба состояния (savedInstanceState и то, что входит в SharedPreferences) должны быть восстановлены в методе onCreate, так как он всегда вызывается всякий раз, когда Activity воссоздается или создается впервые, в то время как onRestoreInstanceState ] не всегда можно вызывать.

public class MainActivity extends AppCompatActivity {
    private static final String TAG = MainActivity.class.getName();
    private static final String CHECKBOX__STATE = "CHECKBOX__SAVE_STATE";

    private Switch checkbox;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        checkbox = findViewById(R.id.checkbox);

        final boolean isChecked;
        if (savedInstanceState != null) {
            isChecked = savedInstanceState.getBoolean(CHECKBOX__STATE);
        } else {
            isChecked = PreferenceManager.getDefaultSharedPreferences(this)
                    .getBoolean(CHECKBOX__STATE, false);
        }

        // Setting the state (if any) of the Switch.
        checkbox.setChecked(isChecked);

        checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    Log.d(TAG, "onCheckedChanged: isChecked = true - log location");
                } else {
                    Log.d(TAG, "onCheckedChanged: isChecked = false - stop logging location");
                }
            }
        });
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putBoolean(CHECKBOX__STATE, checkbox.isChecked());
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        PreferenceManager.getDefaultSharedPreferences(this)
                .edit()
                .putBoolean(CHECKBOX__STATE, checkbox.isChecked())
                .apply();
    }
}

Надеюсь, это поможет: -)

8
задан GEOCHET 15 May 2009 в 17:02
поделиться

6 ответов

Я бы посоветовал вам сначала включить флаги трассировки обнаружения тупиковых ситуаций, а не бесконечно запускать трассировку профилировщика.

Таким образом, сведения о событии будут записываться в SQL Журнал ошибок сервера.

Просмотрите подробные сведения о различных флагах трассировки в следующей электронной документации. Вам нужно использовать 1204 и / или 1222

http://msdn.microsoft.com/en-us/library/ms188396 (SQL.90) .aspx

Обязательно включите флаги трассировки с областью сервера и не только текущая сессия. Например, используйте:

DBCC TRACEON(1222,-1)
3
ответ дан 5 December 2019 в 14:06
поделиться

Вы можете выполнить инструкцию в транзакции, но не можете зафиксировать транзакцию. Поскольку блокировки будут удерживаться до совершения транзакции, это дает вам время для проверки блокировок. (Не бесконечно, но по умолчанию 5 минут.)

Например:

BEGIN TRANSACTION
select * from table

Затем откройте Management Studio и проверьте блокировки. Они находятся в разделе Управление -> Монитор активности -> Блокировки по объекту или Блокировки по процессу. После того, как вы закончите, запустите:

COMMIT TRANSACTION

, чтобы освободить замки.

5
ответ дан 5 December 2019 в 14:06
поделиться

Вот запрос, который покажет вам все активные блокировки, кто их получил и на каком объекте они находятся. Я извлек это из статьи в Technet или что-то много лет назад. Он работает на SQL 2000 и 2005 (замените sysobjects на sys.objects для 2005.) Раскомментируйте предложение WHERE, если вы хотите ограничить его только этой базой данных, и только блокировками «EXCLUSIVE».

select 'Locks' as Locks,
    spid, nt_username, name, hostname, loginame, waittime, open_tran,
    convert(varchar ,getdate() - last_batch, 114) as TimeSinceLastCommand,
    case req_mode
    when  0 then 'Not granted'
    when  1 then 'Schema stability'
    when  2 then 'Schema modification'
    when  3 then 'Intent shared'
    when  4 then 'Shared intent update'
    when  5 then 'Intent shared shared'
    when  6 then 'Intent exclusive'
    when  7 then 'Shared Intent Exclusive'
    when  8 then 'Shared'
    when  9 then 'Update'
    when 10 then 'Intent insert NULL'
    when 11 then 'Intent shared exclusive'
    when 12 then 'Intent update'
    when 13 then 'Intent shared-update'
    when 14 then 'Exclusive'
    when 15 then 'Bulk operation'
    else str(req_mode) end as LockMode
from master..syslockinfo
    left join sysobjects so on so.id = rsc_objid
    left join master..sysprocesses sp on sp.spid = req_spid
--where rsc_dbid = (select db_id()) and ltrim(req_mode) in (6,7,11,14) 
3
ответ дан 5 December 2019 в 14:06
поделиться

запустить трассировку в профилировщике (выбрать пустой шаблон), выбрать событие графика взаимоблокировки и на новой вкладке (Настройки извлечения событий) сохраните каждое (отметьте отдельно сохранение событий тупиковой ситуации XML) в своем собственном файле. Откройте этот файл в программе просмотра XML, и вам будет легко узнать, что происходит. Каждый процесс содержится, со стеком вызовов процедур и т. Д., И все блокировки также присутствуют там.

Дайте этой трассировке продолжаться до тех пор, пока не произойдет повторная блокировка, информация записывается только тогда, когда возникает блокировка, поэтому не слишком много служебной информации. Если это никогда не повторится, хорошо, что это решено, если нет, вы захватили всю информацию.

2
ответ дан 5 December 2019 в 14:06
поделиться

Вы можете запустить трассировку профилировщика на своем устройстве для запросов и посмотреть, какие именно блокировки приняты. Как правило, это огромный объем данных, но в большинстве случаев это шаблоны, которые вы можете просмотреть. Например, для изолированной фиксации чтения вы увидите последовательность блокировок, получаемых и снимаемых при сканировании таблицы или индекса (каждая строка должна быть заблокирована перед чтением, и она сразу же освобождается после чтения).

Под какой изоляцией вы работаете? Какие типы запросов являются взаимоблокирующими? Используете ли вы явные транзакции, которые охватывают несколько обновлений, или они являются взаимоблокировками отдельных операторов?

Наиболее типичным случаем взаимоблокировки является транзакция с последовательностью (таблица обновлений x, таблица обновлений y) и вторая транзакция с последовательностью (обновить таблицу y, обновить таблицу x).

0
ответ дан 5 December 2019 в 14:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: