Transaction Isolation keeps changing (my mind that is). Trying to work out what is best. I was trying snapshot, so that it mimics interbase. I may well just leave it on read/committed.&nbsp;<div><br></div><div>This is one of those subject where I use Prayer as a means of making it work :)</div>
<div><br></div><div>I also realized that the insert was the micro risk.. didn&#39;t know serialized would protect it. I&#39;ll try that and see.</div><div><br></div><div>Thanks for the advise<br><br><div class="gmail_quote">
On Tue, Dec 2, 2008 at 8:08 AM, Neven MacEwan <span dir="ltr">&lt;<a href="mailto:neven@mwk.co.nz">neven@mwk.co.nz</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Kyley<br>
<br>
Looks pretty robust (explicit locks), I&#39;ve never used the output<br>
pseudotable structure (interesting, learn something new),<br>
If you set the &nbsp;TRANSACTION ISOLATION to SERIALIZED could you drop the<br>
explicit locks? and that would also mean that your insert was<br>
protected? There may be a SLIM chance, that if you have a very low &nbsp;TRAN<br>
ISO and you called GENGEN almost simultaneously WITH the same<br>
unititialized @TableName<br>
that the @@Rowcount for the second call would be incorrect (as there<br>
would be a race to insert)<br>
<br>
What is your TRANSACTION ISOLATION?<br>
<br>
Neven<br>
<div><div></div><div class="Wj3C7c"><br>
<br>
<br>
&gt; Where I am mainly using Sequences, not tied to a specific field is<br>
&gt; where many entities in our application<br>
&gt; all use the same number sequence to be attached a unique reference,<br>
&gt; There is a single point of entry to type in that ref# which will open<br>
&gt; anything relevant, ie an invoice, a statement a client, a debtor etc.<br>
&gt; when talking to customers on the phone, it lets the client access<br>
&gt; relevant info very quickly. I don&#39;t tend to use a database to its full<br>
&gt; capacity as a database as oracle and MSSql etc would let you.. its a<br>
&gt; hybrid between the middletier OO layer, and the database.<br>
&gt;<br>
&gt; The actual stored proc I&#39;ve come up with is as follows... I&#39;m just<br>
&gt; waiting to find the flaws.. :D i think 99.999% it will work great..<br>
&gt; all my primary keys are GUIDs.<br>
&gt;<br>
&gt; CREATE PROCEDURE [GETGEN] @TableName VarChar(256), @ACount Int<br>
&gt;<br>
&gt; AS<br>
&gt;<br>
&gt; SET NOCOUNT ON<br>
&gt; DECLARE @AVALUE Int<br>
&gt; BEGIN TRAN<br>
&gt;<br>
&gt; DECLARE @Res TABLE ( ID int )<br>
&gt;<br>
&gt; BEGIN<br>
&gt; &nbsp; UPDATE GEN_IDTABLE with (XLOCK,ROWLOCK)<br>
&gt; &nbsp; SET KEYVALUE = @AVALUE+@ACOUNT<br>
&gt; &nbsp; OUTPUT deleted.KEYVALUE INTO @RES(ID)<br>
&gt; &nbsp; &nbsp; WHERE KEYNAME = @TableName<br>
&gt; &nbsp; if @@ROWCOUNT = 0<br>
&gt; &nbsp; begin<br>
&gt; &nbsp; &nbsp; SET @AVALUE = 1<br>
&gt; &nbsp; &nbsp; INSERT INTO GEN_IDTABLE (KEYNAME,KEYVALUE) VALUES<br>
&gt; (@TableName,@ACount+1);<br>
&gt; &nbsp; end else<br>
&gt; &nbsp; begin<br>
&gt; &nbsp; &nbsp; SELECT @AVALUE=ID from @Res<br>
&gt; &nbsp; end<br>
&gt; END<br>
&gt;<br>
&gt; COMMIT TRAN<br>
&gt; RETURN @AVALUE<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; On Mon, Dec 1, 2008 at 9:40 PM, Neven MacEwan &lt;<a href="mailto:neven@mwk.co.nz">neven@mwk.co.nz</a><br>
</div></div><div class="Ih2E3d">&gt; &lt;mailto:<a href="mailto:neven@mwk.co.nz">neven@mwk.co.nz</a>&gt;&gt; wrote:<br>
&gt;<br>
&gt; &nbsp; &nbsp; Kyley<br>
&gt;<br>
&gt; &nbsp; &nbsp; my experience is with postgreqsl, it has sequences (I assume from its<br>
&gt; &nbsp; &nbsp; oracleness), which get tied to a column via the serial type.<br>
&gt;<br>
&gt; &nbsp; &nbsp; I&#39;m puzzled as to where you would use a Sequence/Generator in a non-pk<br>
&gt; &nbsp; &nbsp; situation, unless you<br>
&gt; &nbsp; &nbsp; are talking about your &#39;documentno&#39; column, which as shown can be done<br>
&gt; &nbsp; &nbsp; via a stored proc<br>
&gt;<br>
&gt; &nbsp; &nbsp; I wonder is mssql eventually will allow functions to update tables (or<br>
&gt; &nbsp; &nbsp; code a primative sequence generation)<br>
&gt; &nbsp; &nbsp; which would allow this<br>
&gt;<br>
&gt; &nbsp; &nbsp; Neven<br>
&gt;<br>
&gt; &nbsp; &nbsp; &gt; The main difference is that a Generator is more like an Oracle<br>
&gt; &nbsp; &nbsp; Sequence,<br>
&gt; &nbsp; &nbsp; &gt; It is table independant, which allows you to use the same sequence<br>
&gt; &nbsp; &nbsp; &gt; accross more than one table,<br>
&gt; &nbsp; &nbsp; &gt; and you can also have more than one per table. I find the<br>
&gt; &nbsp; &nbsp; identity is<br>
&gt; &nbsp; &nbsp; &gt; only useful if it is to be a primary key, not useful as a data<br>
&gt; &nbsp; &nbsp; element.<br>
&gt; &nbsp; &nbsp; &gt;<br>
&gt; &nbsp; &nbsp; &gt; On Mon, Dec 1, 2008 at 5:12 PM, Neven MacEwan &lt;<a href="mailto:neven@mwk.co.nz">neven@mwk.co.nz</a><br>
&gt; &nbsp; &nbsp; &lt;mailto:<a href="mailto:neven@mwk.co.nz">neven@mwk.co.nz</a>&gt;<br>
</div><div><div></div><div class="Wj3C7c">&gt; &nbsp; &nbsp; &gt; &lt;mailto:<a href="mailto:neven@mwk.co.nz">neven@mwk.co.nz</a> &lt;mailto:<a href="mailto:neven@mwk.co.nz">neven@mwk.co.nz</a>&gt;&gt;&gt; wrote:<br>
&gt; &nbsp; &nbsp; &gt;<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; John<br>
&gt; &nbsp; &nbsp; &gt;<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; Really interbase generators are more akin to the mssql<br>
&gt; &nbsp; &nbsp; identity column<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; type, the problem with mssql identity columns WAS<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; with the @@Identity variable which was per connection (and hence<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; triggers that inserted other identity columns not return the<br>
&gt; &nbsp; &nbsp; identity<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; you would expect), &nbsp;this has been &#39;fixed&#39; with the<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; SCOPE_IDENTITY() function<br>
&gt; &nbsp; &nbsp; &gt;<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; Stangely identity columns and generators behave the same<br>
&gt; &nbsp; &nbsp; way, ie they<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; are both not rolled back by a trans<br>
&gt; &nbsp; &nbsp; &gt;<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; PostgeSQL, uses a combo of both a column type of &#39;serial&#39;,<br>
&gt; &nbsp; &nbsp; which auto<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; generates a &#39;sequence&#39;<br>
&gt; &nbsp; &nbsp; &gt;<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; Of course I could be spouting BS.<br>
&gt; &nbsp; &nbsp; &gt;<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; Neven<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; //<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; &gt; Whats others opinion on the merits of trggers etc as discussed<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; here vs the<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; &gt; Firebird/Interbase method of using generators?<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; &gt;<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; &gt; I have often wondered if this is an area where<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; Firebird/Interbase has a less<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; &gt; convenient but more transparent mechanism - where you have<br>
&gt; &nbsp; &nbsp; to fire a<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; &gt; generator to get a new key value before you start putting data<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; in a new<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; &gt; record.<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; &gt;<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; &gt; And the generator never rolls back even if the transaction<br>
&gt; &nbsp; &nbsp; does<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; - avoiding<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; &gt; the lock problem. &nbsp;Mostly in<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; &gt; my experience this is fine, except some times when the ID<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; numbers (eg batch<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; &gt; numbers) are supposed to be strictly sequential and then you<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; have to get the<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; &gt; next value from a SQL query, and make sure no-one else is<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; running another of<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; &gt; the same batch at the same time. &nbsp;(In those situations the<br>
&gt; &nbsp; &nbsp; main<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; thing that<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; &gt; protects the database is that only one staff member ever runs<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; this batch<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; &gt; operation - I bet thats how a lot of databases run in<br>
&gt; &nbsp; &nbsp; practice)<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; &gt;<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; &gt;<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; &gt; John<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; &gt;<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; &gt; _______________________________________________<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; &gt; NZ Borland Developers Group - Delphi mailing list<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; &gt; Post: <a href="mailto:delphi@delphi.org.nz">delphi@delphi.org.nz</a> &lt;mailto:<a href="mailto:delphi@delphi.org.nz">delphi@delphi.org.nz</a>&gt;<br>
</div></div>&gt; &nbsp; &nbsp; &lt;mailto:<a href="mailto:delphi@delphi.org.nz">delphi@delphi.org.nz</a> &lt;mailto:<a href="mailto:delphi@delphi.org.nz">delphi@delphi.org.nz</a>&gt;&gt;<br>
<div class="Ih2E3d">&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; &gt; Admin: <a href="http://delphi.org.nz/mailman/listinfo/delphi" target="_blank">http://delphi.org.nz/mailman/listinfo/delphi</a><br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; &gt; Unsubscribe: send an email to <a href="mailto:delphi-request@delphi.org.nz">delphi-request@delphi.org.nz</a><br>
&gt; &nbsp; &nbsp; &lt;mailto:<a href="mailto:delphi-request@delphi.org.nz">delphi-request@delphi.org.nz</a>&gt;<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; &lt;mailto:<a href="mailto:delphi-request@delphi.org.nz">delphi-request@delphi.org.nz</a><br>
&gt; &nbsp; &nbsp; &lt;mailto:<a href="mailto:delphi-request@delphi.org.nz">delphi-request@delphi.org.nz</a>&gt;&gt; with Subject: unsubscribe<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; &gt;<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; &gt;<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; &gt;<br>
&gt; &nbsp; &nbsp; &gt;<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; _______________________________________________<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; NZ Borland Developers Group - Delphi mailing list<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; Post: <a href="mailto:delphi@delphi.org.nz">delphi@delphi.org.nz</a> &lt;mailto:<a href="mailto:delphi@delphi.org.nz">delphi@delphi.org.nz</a>&gt;<br>
</div>&gt; &nbsp; &nbsp; &lt;mailto:<a href="mailto:delphi@delphi.org.nz">delphi@delphi.org.nz</a> &lt;mailto:<a href="mailto:delphi@delphi.org.nz">delphi@delphi.org.nz</a>&gt;&gt;<br>
<div class="Ih2E3d">&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; Admin: <a href="http://delphi.org.nz/mailman/listinfo/delphi" target="_blank">http://delphi.org.nz/mailman/listinfo/delphi</a><br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; Unsubscribe: send an email to <a href="mailto:delphi-request@delphi.org.nz">delphi-request@delphi.org.nz</a><br>
&gt; &nbsp; &nbsp; &lt;mailto:<a href="mailto:delphi-request@delphi.org.nz">delphi-request@delphi.org.nz</a>&gt;<br>
&gt; &nbsp; &nbsp; &gt; &nbsp; &nbsp; &lt;mailto:<a href="mailto:delphi-request@delphi.org.nz">delphi-request@delphi.org.nz</a><br>
</div><div><div></div><div class="Wj3C7c">&gt; &nbsp; &nbsp; &lt;mailto:<a href="mailto:delphi-request@delphi.org.nz">delphi-request@delphi.org.nz</a>&gt;&gt; with Subject: unsubscribe<br>
&gt; &nbsp; &nbsp; &gt;<br>
&gt; &nbsp; &nbsp; &gt;<br>
&gt; &nbsp; &nbsp; &gt;<br>
&gt; &nbsp; &nbsp; &gt;<br>
&gt; &nbsp; &nbsp; &gt; --<br>
&gt; &nbsp; &nbsp; &gt; Kyley Harris<br>
&gt; &nbsp; &nbsp; &gt; Harris Software<br>
&gt; &nbsp; &nbsp; &gt; +64-21-671-821<br>
&gt; &nbsp; &nbsp; &gt;<br>
&gt; &nbsp; &nbsp; ------------------------------------------------------------------------<br>
&gt; &nbsp; &nbsp; &gt;<br>
&gt; &nbsp; &nbsp; &gt; _______________________________________________<br>
&gt; &nbsp; &nbsp; &gt; NZ Borland Developers Group - Delphi mailing list<br>
&gt; &nbsp; &nbsp; &gt; Post: <a href="mailto:delphi@delphi.org.nz">delphi@delphi.org.nz</a> &lt;mailto:<a href="mailto:delphi@delphi.org.nz">delphi@delphi.org.nz</a>&gt;<br>
&gt; &nbsp; &nbsp; &gt; Admin: <a href="http://delphi.org.nz/mailman/listinfo/delphi" target="_blank">http://delphi.org.nz/mailman/listinfo/delphi</a><br>
&gt; &nbsp; &nbsp; &gt; Unsubscribe: send an email to <a href="mailto:delphi-request@delphi.org.nz">delphi-request@delphi.org.nz</a><br>
&gt; &nbsp; &nbsp; &lt;mailto:<a href="mailto:delphi-request@delphi.org.nz">delphi-request@delphi.org.nz</a>&gt; with Subject: unsubscribe<br>
&gt;<br>
&gt; &nbsp; &nbsp; _______________________________________________<br>
&gt; &nbsp; &nbsp; NZ Borland Developers Group - Delphi mailing list<br>
&gt; &nbsp; &nbsp; Post: <a href="mailto:delphi@delphi.org.nz">delphi@delphi.org.nz</a> &lt;mailto:<a href="mailto:delphi@delphi.org.nz">delphi@delphi.org.nz</a>&gt;<br>
&gt; &nbsp; &nbsp; Admin: <a href="http://delphi.org.nz/mailman/listinfo/delphi" target="_blank">http://delphi.org.nz/mailman/listinfo/delphi</a><br>
&gt; &nbsp; &nbsp; Unsubscribe: send an email to <a href="mailto:delphi-request@delphi.org.nz">delphi-request@delphi.org.nz</a><br>
&gt; &nbsp; &nbsp; &lt;mailto:<a href="mailto:delphi-request@delphi.org.nz">delphi-request@delphi.org.nz</a>&gt; with Subject: unsubscribe<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt; Kyley Harris<br>
&gt; Harris Software<br>
&gt; +64-21-671-821<br>
&gt; ------------------------------------------------------------------------<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; NZ Borland Developers Group - Delphi mailing list<br>
&gt; Post: <a href="mailto:delphi@delphi.org.nz">delphi@delphi.org.nz</a><br>
&gt; Admin: <a href="http://delphi.org.nz/mailman/listinfo/delphi" target="_blank">http://delphi.org.nz/mailman/listinfo/delphi</a><br>
&gt; Unsubscribe: send an email to <a href="mailto:delphi-request@delphi.org.nz">delphi-request@delphi.org.nz</a> with Subject: unsubscribe<br>
<br>
_______________________________________________<br>
NZ Borland Developers Group - Delphi mailing list<br>
Post: <a href="mailto:delphi@delphi.org.nz">delphi@delphi.org.nz</a><br>
Admin: <a href="http://delphi.org.nz/mailman/listinfo/delphi" target="_blank">http://delphi.org.nz/mailman/listinfo/delphi</a><br>
Unsubscribe: send an email to <a href="mailto:delphi-request@delphi.org.nz">delphi-request@delphi.org.nz</a> with Subject: unsubscribe<br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>Kyley Harris<br>Harris Software<br>+64-21-671-821<br>
</div>