Я должен фиксировать или откатывать транзакцию чтения?

Использование PDO и MYSQLi является хорошей практикой для предотвращения инъекций SQL, но если вы действительно хотите работать с функциями и запросами MySQL, было бы лучше использовать

mysql_real_escape_string

$unsafe_variable = mysql_real_escape_string($_POST['user_input']);

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

is_string

$unsafe_variable = (is_string($_POST['user_input']) ? $_POST['user_input'] : '');

is_numeric

$unsafe_variable = (is_numeric($_POST['user_input']) ? $_POST['user_input'] : '');

И гораздо лучше использовать эти функции для проверки входных данных с помощью mysql_real_escape_string.

91
задан Wolf 11 January 2018 в 11:52
поделиться

9 ответов

Вы фиксируете. Период. Нет никакой другой разумной альтернативы. При запуске транзакции необходимо закрыть ее. Фиксация выпускает любые блокировки, которые Вы, возможно, имели и одинаково разумны с ReadUncommitted или Уровнями сериализуемой изоляции. Доверие неявному откату - в то время как, возможно, технически эквивалентный - просто плохая форма.

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

50
ответ дан Mark Brackett 24 November 2019 в 06:52
поделиться

Если Вы ничего не изменили, то можно использовать или ФИКСАЦИЮ или ОТКАТ. Любой выпустит любые блокировки чтения, которые Вы получили и так как Вы не внесли никакие другие изменения, они будут эквивалентны.

25
ответ дан Graeme Perrow 24 November 2019 в 06:52
поделиться

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

6
ответ дан Neil Barnwell 24 November 2019 в 06:52
поделиться

Просто примечание стороны, но можно также записать что код как это:

using (IDbConnection connection = ConnectionFactory.CreateConnection())
using (IDbTransaction transaction = connection.BeginTransaction(IsolationLevel.ReadUncommitted))
using (IDbCommand command = connection.CreateCommand())
{
    command.Transaction = transaction;
    command.CommandText = "SELECT * FROM SomeTable";
    using (IDataReader reader = command.ExecuteReader())
    {
        // Do something useful
    }
    // To commit, or not to commit?
}

И если Вы реструктурируете вещи просто немного, Вы могли бы быть в состоянии переместить блок использования для IDataReader до вершины также.

2
ответ дан Joel Coehoorn 24 November 2019 в 06:52
поделиться

Если Вы помещаете SQL в хранимую процедуру и добавляете это выше запроса:

set transaction isolation level read uncommitted

тогда Вы не должны переходить ни через какие обручи в коде C#. Установка уровня изоляции транзакции в хранимой процедуре не заставляет установку относиться ко всему будущему использованию того соединения (который является чем-то, о чем необходимо волноваться с другими настройками, так как соединения объединены). В конце хранимой процедуры это просто возвращается к тому, с чем было инициализировано соединение.

1
ответ дан Eric Z Beard 24 November 2019 в 06:52
поделиться

Учитывая, что ЧТЕНИЕ не изменяет состояние, я ничего не сделал бы. Выполнение фиксации ничего не сделает, кроме отходов цикл для отправления запроса к базе данных. Вы не выполнили операцию, которая изменила состояние. Аналогично для отката.

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

0
ответ дан Brett McCann 24 November 2019 в 06:52
поделиться

В Вашем примере кода, где Вы имеете

  1. //, Делают что-то полезное

    , Вы выполняете SQL-оператор, который изменяет данные?

В противном случае нет такой вещи как Транзакция "Чтения"... Только изменения от Вставки, Обновления и Операторов удаления (операторы, которые могут изменить данные) находятся в Транзакции... То, о чем Вы говорите, является блокировками, что SQL Server ставит данные, которые Вы считываете из-за ДРУГИХ транзакций то влияние те данные. Уровень этих блокировок является иждивенцем на Уровне изоляции SQL Server.

, Но Вы не можете Фиксировать или Откатывать что-либо, если Ваш SQL-оператор ничего не изменил.

при изменении данных, тогда можно изменить уровень изоляции, явно не запуская переход... Каждый отдельный SQL-оператор находится неявно в транзакции. явно запуск Транзакции только необходим, чтобы гарантировать, что 2 или больше оператора в той же транзакции.

, Если все Вы хотите сделать, установлен уровень изоляции транзакции, тогда просто установите CommandText команды для "Установки Уровня изоляции транзакции Повторяемое Чтение" (или безотносительно уровня, который Вы хотите), установите CommandType на CommandType. Текст, и выполняет команду. (можно использовать Команду. ExecuteNonQuery ())

ПРИМЕЧАНИЕ: Если Вы делаете НЕСКОЛЬКО операторов чтения и хотите, чтобы они все "видели" то же состояние базы данных как первая, то необходимо установить вершину уровня изоляции Повторяемое Чтение или сериализуемый...

-2
ответ дан Charles Bretana 24 November 2019 в 06:52
поделиться

Необходимо ли заблокировать других от чтения тех же данных? Почему использование транзакция?

@Joel - Мой вопрос лучше формулировался бы как, "Почему использование транзакция на чтении запрашивает?"

@Stefan - Если Вы собираетесь использовать AdHoc SQL и не сохраненный proc, тогда просто, добавьте С (NOLOCK) после таблиц в запросе. Таким образом, Вы не подвергаетесь издержкам (хотя минимальный) в приложении и базе данных для транзакции.

SELECT * FROM SomeTable WITH (NOLOCK)

РЕДАКТИРОВАНИЕ Комментарий 3: Так как у Вас был "sqlserver" в тегах вопроса, я предположил, что MSSQLServer был целевым продуктом. Теперь, когда та мысль была прояснена, я отредактировал теги для удаления определенной ссылки продукта.

я все еще не уверен в том, почему Вы хотите сделать транзакцию на чтении op во-первых.

-3
ответ дан StingyJack 24 November 2019 в 06:52
поделиться

По моему скромному мнению, может иметь смысл переносить запросы только для чтения в транзакции как (особенно в Java), можно сказать транзакции быть "только для чтения", который в свою очередь драйвер JDBC может рассмотреть оптимизацией запроса (но не имеет к, таким образом, никто не будет препятствовать тому, чтобы Вы вышли INSERT тем не менее). Например, драйвер Oracle полностью избежит блокировок таблицы на запросах в транзакции, отмеченной только для чтения, который получает большую производительность на в большой степени управляемых чтением приложениях.

3
ответ дан Oliver Drotbohm 24 November 2019 в 06:52
поделиться
Другие вопросы по тегам:

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