[Lazarus] SQLDB - Can't attach second SQLite database because transaction

Michael Van Canneyt michael at freepascal.org
Mon Jan 7 20:03:19 CET 2013



On Mon, 7 Jan 2013, Ludo Brands wrote:

> On 07/01/2013 17:23, Michael Van Canneyt wrote:
>> 
>> 
>> On Mon, 7 Jan 2013, Ludo Brands wrote:
>> 
>>> On 07/01/2013 16:01, Michael Van Canneyt wrote:
>>>> 
>>>> 
>>>> On Mon, 7 Jan 2013, Krzysztof wrote:
>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 2013/1/7 Michael Van Canneyt <michael at freepascal.org>
>>>>> 
>>>>> Maybe we should make a method for this in TSQLite3Connection ?
>>>>> 
>>>>> 
>>>>> It would be great. Because without this we can't use all opportunities 
>>>>> of SQLite, like attaching databases or also VACUUM (trim and pack 
>>>>> database)
>>>> 
>>>> I meant a method Procedure AttachDatabase(Const AFileName, AnAlias : 
>>>> String);
>>>> ?
>>>> 
>>>> Other methods can also be added, of course.
>>>> 
>>> A method to execute a statement outside a transaction would also be useful 
>>> for the following reasons:
>> 
>> That will have to be database-specific.
>> 
>> For example Firebird does not allow you to execute statements "outside a 
>> transaction".
> Firebird starts the transaction implicitly when the transaction hasn't 
> started. So a user that uses this new method has to manually commit or 
> rollback.

I don't follow ?

> Firebird has virtually no sql commands for maintenance or system 
> administration which explains why all SQL statements are running inside a 
> transaction.

Ah ? Can you name a few ?

>>> - Some statements end implicitly a transaction. Ex: 
>>> http://dev.mysql.com/doc/refman/5.0/en/implicit-commit.html or all oracle 
>>> DDL statements. sqldb is not aware that the transaction is terminated and 
>>> its state doesn't match the db state.
>>> - You can't make a method for every database command that has to run 
>>> outside a transaction.
>> 
>> Why not ?
>> 
> Of course you can when you have all the time of the world. A method that 
> bypasses sql transaction control covers all cases once it is released. Any 
> custom connector method is trunk first and then wait for next release to get 
> it "production ready".

Eh ? That is the same for the bypass ?

>
>> If they are implemented in the specific connections, I do not see what 
>> problem there could be with that. Such methods already exist. People 
>> relying on such constructs should be aware that they are database-specific.
>> 
>> Problems arise only if you try to elevate some methods to TSQLConnection 
>> for something that is not supported by all databases...
>> 
> Yep. That is exactly what is happening now with the statements that 
> implicitly terminate transactions without sqldb knowing about it.

It would be the same if you had only 1 transaction per connection ?
No single client solution can handle this, unless it knows exactly 
which statements cause this implicit transaction commit ?

Michael.




More information about the Lazarus mailing list