<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SQL - Etienne ZINZINDOHOUE &#187; ORACLE</title>
	<atom:link href="https://blog.developpez.com/zinzineti/pcategory/oracle/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/zinzineti</link>
	<description>Bases de données</description>
	<lastBuildDate>Thu, 09 Aug 2012 13:57:35 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>AUTOCOMMIT ou COMMIT IMPLICITE : quelle confusion ?</title>
		<link>https://blog.developpez.com/zinzineti/p10924/sql-server-2008/autocommit_ou_commit_implicite_quelle_co</link>
		<comments>https://blog.developpez.com/zinzineti/p10924/sql-server-2008/autocommit_ou_commit_implicite_quelle_co#comments</comments>
		<pubDate>Thu, 05 Apr 2012 16:47:40 +0000</pubDate>
		<dc:creator><![CDATA[zinzineti]]></dc:creator>
				<category><![CDATA[ORACLE]]></category>
		<category><![CDATA[SQL SERVER 2008]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[La norme SQL standard (ANSI/ISO) affirme que : 1. la première instruction SQL lancée depuis une session est considérée comme le début d&#8217;une transaction (même si le verbe BEGIN TRANSACTION n&#8217;est pas indiqué). 2. la fin de toute transaction DOIT se terminer de façon EXPLICITE par un ROLLBACK ou un COMMIT. C&#8217;est ce que dit la norme SQL à propos de la notion de début et fin d&#8217;une transaction SQL. Rappelons qu&#8217;une transaction SQL est [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>La norme SQL standard (ANSI/ISO) affirme que :<br />
<strong>1.</strong> la première instruction SQL lancée depuis une session est considérée comme le début d&rsquo;une transaction (même si le verbe BEGIN TRANSACTION n&rsquo;est pas indiqué).<br />
<strong>2.</strong> la fin de toute transaction <strong>DOIT</strong> se terminer de façon <strong>EXPLICITE</strong> par un <strong>ROLLBACK</strong> ou un <strong>COMMIT</strong>.<br />
C&rsquo;est ce que dit la norme SQL à propos de la notion de début et fin d&rsquo;une transaction SQL.<br />
Rappelons qu&rsquo;une transaction SQL est une entité logique comportant une ou plusieurs instruction SQL.<br />
Par défaut SQL SERVER considère chaque instruction comme une transaction et fait des COMMITs implicites après chaque exécution : c&rsquo;est l&rsquo;AUTOCOMMIT.<br />
Par défaut ORACLE fait des commit implicites à la fin de chaque instruction DDL (CREATE, ALTER, DROP). Notons que sur ce point ORACLE est plus proche de la norme que SQL SERVER.<br />
Ce que je ne comprends pas c&rsquo;est la confusion que crée MS SQL SERVER autour de la définition de l&rsquo;option AUTOCOMMIT. De quoi s&rsquo;agit-il exactement ?<span id="more-101"></span><br />
D&rsquo;après la documentation officielle de MS SQL SERVER :<br />
Version originale<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<blockquote><p>SET IMPLICIT_TRANSACTIONS { ON | OFF }<br />
Sets implicit transaction mode for the connection.<br />
When ON, SET IMPLICIT_TRANSACTIONS sets the connection into implicit transaction mode.<br />
When OFF, it returns the connection to autocommit transaction mode.</p></blockquote>
<p>Traduction en français<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<blockquote><p>SET IMPLICIT_TRANSACTIONS { ON | OFF }<br />
Définit le mode de transaction implicite pour la connexion.<br />
Si sa valeur est ON, SET IMPLICIT_TRANSACTIONS met la connexion en mode de transaction implicite.<br />
Si la valeur est OFF, la connexion est remise en mode de validation automatique.</p></blockquote>
<p>D&rsquo;après ce qui est écrit dans la documentation officielle :<br />
<strong>SET IMPLICIT_TRANSACTIONS OFF = AUTOCOMMIT (validation automatique).<br />
Mais le problème c&rsquo;est que si IMPLICIT_&#8230;. est OFF on peut penser qu&rsquo;on est en mode EXPLICIT_&#8230; et en EXPLICIT_&#8230; ce n&rsquo;est plus de l&rsquo;AUTOCOMMIT ! </strong></p>
<p>=> <strong>Sous SQL SERVER</strong><br />
D&rsquo;abord comment identifier l&rsquo;option SET IMPLICIT_TRANSACTIONS de ma session ?</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">SELECT CASE WHEN (@@OPTIONS &amp; 2 = 2) THEN &nbsp;'IMPLICIT_TRANSACTIONS ON' <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ELSE 'IMPLICIT_TRANSACTIONS OFF' <br />
&nbsp; &nbsp; &nbsp; &nbsp; END 'IMPLICIT_TRANSACTIONS'</div></div>
<p><strong>Exemple avec SET IMPLICIT_TRANSACTIONS OFF</strong><br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
Session 1<br />
&#8212;&#8212;&#8212;</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">IF OBJECT_ID(N't1', N'U') IS NOT NULL DROP TABLE t1; <br />
SET IMPLICIT_TRANSACTIONS OFF <br />
CREATE TABLE t1(c INT); <br />
INSERT INTO t1 VALUES (1);</div></div>
<p>Session 2<br />
&#8212;&#8212;&#8212;<br />
<code class="codecolorer text default"><span class="text">SELECT * FROM t1</span></code></p>
<p><strong>La session 2 affiche bien les données de la table t1</strong></p>
<p><strong>Exemple avec SET IMPLICIT_TRANSACTIONS ON</strong><br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
Session 1<br />
&#8212;&#8212;&#8212;</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">IF OBJECT_ID(N't1', N'U') IS NOT NULL DROP TABLE t1; <br />
SET IMPLICIT_TRANSACTIONS ON <br />
CREATE TABLE t1(c INT); <br />
INSERT INTO t1 VALUES (1);</div></div>
<p>Session 2<br />
&#8212;&#8212;&#8212;<br />
<code class="codecolorer text default"><span class="text">SELECT * FROM t1</span></code></p>
<p><strong>Impossible de lire les données de la table t1 depuis la session 2, puisque la transaction n&rsquo;est pas encore validée (commit) par la session 1</strong></p>
<p>=> <strong>Sous ORACLE </strong><br />
D&rsquo;abord comment identifier l&rsquo;option AUTOCOMMIT de ma session ?</p>
<p><code class="codecolorer text default"><span class="text">SQL&gt; SHOW AUTOCOMMIT;</span></code></p>
<p><strong>Exemple avec AUTOCOMMIT ON</strong><br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
Session 1<br />
&#8212;&#8212;&#8212;</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">SET AUTOCOMMIT ON <br />
CREATE TABLE t1(c INT); <br />
INSERT INTO t1 VALUES (1);</div></div>
<p>Session 2<br />
&#8212;&#8212;&#8212;<br />
<code class="codecolorer text default"><span class="text">SELECT * FROM t1</span></code><br />
<strong>La session 2 affiche bien les données de la table t1</strong></p>
<p><strong>Exemple avec AUTOCOMMIT OFF</strong><br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
Session 1<br />
&#8212;&#8212;&#8212;</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">SET AUTOCOMMIT OFF <br />
CREATE TABLE t1(c INT); <br />
INSERT INTO t1 VALUES (1);</div></div>
<p>Session 2<br />
&#8212;&#8212;&#8212;<br />
<code class="codecolorer text default"><span class="text">SELECT * FROM t1</span></code><br />
<strong>Impossible de lire les données de la table t1 depuis la session 2, puisque la transaction n&rsquo;est pas encore validée (commit) par la session 1</strong></p>
<p>Pour conclure notons que pour MS SQL SERVER SET IMPLICIT_TRANSACTIONS OFF = AUTOCOMMIT. À mon humble avis, MS SQL SERVER devrait plutôt mettre <strong>SET IMPLICIT_TRANSACTIONS ON = AUTOCOMMIT</strong></p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
Etienne ZINZINDOHOUE<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
