Я помогаю с тупиковой охотой. Среда: Tomcat 5.5, Java 5, Microsoft SQL Server 2008, jTDS (замена старого драйвера). У нас есть устаревший пул соединений.
Код базы данных всегда следует этой схеме:
connection = connectionPool.getConnection(); // 1
boolean previousAutoCommitStatus = connection.getAutoCommit(); // 2
connection.setAutoCommit(false); // 3
// ... use the connection ...
// execute prepared statement 4
// execute prepared statement 5
// execute prepared statement 6
connection.commit(); // 7
connection.setAutoCommit(previousAutoCommitStatus); // 8
connectionPool.releaseConnection(connection); // 9
Пока мы охотились за ошибкой (простите: программный дефект), мне было интересно: как работает драйвер? Мое предположение: все, что я делаю между (3) и (7), ставится в очередь драйвером / СУБД. Только когда я connection.commit()
СУБД начинает новую транзакцию, получает каждую блокировку, необходимую для операций (я надеюсь, что она достаточно умна, чтобы блокировать меньший возможный набор объектов), выполняет операторы и снимает блокировку, закрывая транзакцию.
Или, как только я выполню подготовленный оператор, СУБД блокирует таблицу?
РЕДАКТИРОВАТЬ : что я хочу понять, так это, если «commit ()» преобразуется в набор операторов SQL, начинающихся с «начать таблицу транс / блокировки» и заканчивающихся «таблица фиксации / разблокировки» или если любая Java executeStatement()
немедленно получает блокировку.
ТИА