Обсуждение: lock problem when dont commit

Поиск
Список
Период
Сортировка

lock problem when dont commit

От
Mican Bican
Дата:
Hello

I use postgresql 8.0.1 under windows and jdbc3 with new java tiger...

i work on a database with manuel commits and rollback..

my problem is when 2 people work in on the same time on the database:

---table liefAdress-------------

pseudecode

client1:
...
conn.setAutoCommit(false)
insert into liefAdress(adress,postcode)
//id is autoincrement
insert into liefAdress(adress2,postcode2)
....

client2:
insert into liefAdress(adress3,postcode3)

--->here is the problem user1 dont commit his
transactions.. the client software are locked..
you can do nothing in the programm..!!

client1:
conn.commit()
//all the adresses are inserted

client2:
the adress is also inserted and the
java clientsoftware is unlocked...!


my question is why the java programm from client2 is locked???
can I say to the connection "when you must wait for the commit of the
other users
bring me a warning" or why the row from client2 are not inserted???? I
dont lock everything.. must i change the transaction mode?? I use the
default transaction mode..

thank you for your answers!!!


Mican Bican

Re: lock problem when dont commit

От
Dave Cramer
Дата:
There must be something else going on here. There is no lock on an
insert. Are you doing a select for update ?

Dave

Mican Bican wrote:

>Hello
>
>I use postgresql 8.0.1 under windows and jdbc3 with new java tiger...
>
>i work on a database with manuel commits and rollback..
>
>my problem is when 2 people work in on the same time on the database:
>
>---table liefAdress-------------
>
>pseudecode
>
>client1:
>...
>conn.setAutoCommit(false)
>insert into liefAdress(adress,postcode)
>//id is autoincrement
>insert into liefAdress(adress2,postcode2)
>....
>
>client2:
>insert into liefAdress(adress3,postcode3)
>
>--->here is the problem user1 dont commit his
>transactions.. the client software are locked..
>you can do nothing in the programm..!!
>
>client1:
>conn.commit()
>//all the adresses are inserted
>
>client2:
>the adress is also inserted and the
>java clientsoftware is unlocked...!
>
>
>my question is why the java programm from client2 is locked???
>can I say to the connection "when you must wait for the commit of the
>other users
>bring me a warning" or why the row from client2 are not inserted???? I
>dont lock everything.. must i change the transaction mode?? I use the
>default transaction mode..
>
>thank you for your answers!!!
>
>
>Mican Bican
>
>---------------------------(end of broadcast)---------------------------
>TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org
>
>
>
>

--
Dave Cramer
http://www.postgresintl.com
519 939 0336
ICQ#14675561


Re: lock problem when dont commit

От
Tom Lane
Дата:
Dave Cramer <pg@fastcrypt.com> writes:
> There must be something else going on here. There is no lock on an
> insert. Are you doing a select for update ?

Maybe a conflict on referenced foreign-key rows?

            regards, tom lane

Re: lock problem when dont commit

От
Dave Cramer
Дата:
Tom,

can you explain how that happens?

Dave

Tom Lane wrote:

>Dave Cramer <pg@fastcrypt.com> writes:
>
>
>>There must be something else going on here. There is no lock on an
>>insert. Are you doing a select for update ?
>>
>>
>
>Maybe a conflict on referenced foreign-key rows?
>
>            regards, tom lane
>
>---------------------------(end of broadcast)---------------------------
>TIP 6: Have you searched our list archives?
>
>               http://archives.postgresql.org
>
>
>
>

--
Dave Cramer
http://www.postgresintl.com
519 939 0336
ICQ#14675561


Re: lock problem when dont commit

От
Tom Lane
Дата:
Dave Cramer <pg@fastcrypt.com> writes:
> Tom Lane wrote:
>> Maybe a conflict on referenced foreign-key rows?

> can you explain how that happens?

When you insert or update a row in a table that has an FK reference,
it takes out a row-level lock on the referenced row in the master table.
This is needed to prevent someone else from deleting the master row
before commit.  (Since the someone else can't see your uncommitted row,
nothing but a lock could stop them from thinking it's OK to remove the
master row.)

So if two sessions are trying to insert rows that reference the same
master row, they conflict --- because the only type of row-level lock
we have at the moment is exclusive.  I believe Alvaro is looking into
supporting shared row-level locks for 8.1, which'd make this problem
go away.

            regards, tom lane

Re: lock problem when dont commit

От
Mican Bican
Дата:
Tom Lane schrieb:

>Dave Cramer <pg@fastcrypt.com> writes:
>
>
>>Tom Lane wrote:
>>
>>
>>>Maybe a conflict on referenced foreign-key rows?
>>>
>>>
>
>
>
>>can you explain how that happens?
>>
>>
>
>When you insert or update a row in a table that has an FK reference,
>it takes out a row-level lock on the referenced row in the master table.
>This is needed to prevent someone else from deleting the master row
>before commit.  (Since the someone else can't see your uncommitted row,
>nothing but a lock could stop them from thinking it's OK to remove the
>master row.)
>
>So if two sessions are trying to insert rows that reference the same
>master row, they conflict --- because the only type of row-level lock
>we have at the moment is exclusive.  I believe Alvaro is looking into
>supporting shared row-level locks for 8.1, which'd make this problem
>go away.
>
>            regards, tom lane
>
>
>
Ok I think thats the problem.. because

client1:

...
conn.setAutoCommit(false)
insert into liefAdress(adress,postcode)
//id is autoincrement
insert into liefAdress(adress2,postcode2)
....
....


postcode is a FK to a list with postcodes. When I want insert different
postcodes they are no locked.. there is only locked when the postcode are
same. But why there are locked? Have anybody a good
Idea to deal with this problem..?


Re: lock problem when dont commit

От
Dave Cramer
Дата:
As Tom pointed out this behaviour will not change in the immediate
future.  I think your best bet is not to hold the lock for so long.

I generally prepare all the data and do the insert in one statement.

Dave

Mican Bican wrote:

> Tom Lane schrieb:
>
>> Dave Cramer <pg@fastcrypt.com> writes:
>>
>>
>>> Tom Lane wrote:
>>>
>>>
>>>> Maybe a conflict on referenced foreign-key rows?
>>>>
>>>
>>
>>
>>
>>> can you explain how that happens?
>>>
>>
>>
>> When you insert or update a row in a table that has an FK reference,
>> it takes out a row-level lock on the referenced row in the master table.
>> This is needed to prevent someone else from deleting the master row
>> before commit.  (Since the someone else can't see your uncommitted row,
>> nothing but a lock could stop them from thinking it's OK to remove the
>> master row.)
>>
>> So if two sessions are trying to insert rows that reference the same
>> master row, they conflict --- because the only type of row-level lock
>> we have at the moment is exclusive.  I believe Alvaro is looking into
>> supporting shared row-level locks for 8.1, which'd make this problem
>> go away.
>>
>>             regards, tom lane
>>
>>
>>
> Ok I think thats the problem.. because
>
> client1:
>
> ...
> conn.setAutoCommit(false)
> insert into liefAdress(adress,postcode) //id is autoincrement insert
> into liefAdress(adress2,postcode2)
> ....
> ....
>
>
> postcode is a FK to a list with postcodes. When I want insert different
> postcodes they are no locked.. there is only locked when the postcode are
> same. But why there are locked? Have anybody a good
> Idea to deal with this problem..?
>
> ---------------------------(end of broadcast)---------------------------
> TIP 7: don't forget to increase your free space map settings
>
>

--
Dave Cramer
http://www.postgresintl.com
519 939 0336
ICQ#14675561