Transaction should be a significant Unit of Work. But what makes up the Unit of Work depends on the context. In the OLTP system, the Work unit will be the only character along with their address information, etc. But it sounds like you are doing some form of batch processing that loads a lot of people.
If you are having problems with ORA-1555, this is almost certainly because you have a long query providing data that is updated by other transactions. Locking within your loop contributes to the cyclical use of UNDO segments, and therefore will tend to increase the likelihood that the segments you rely on to ensure read consistency will be reused. So, not doing this is probably a good idea.
Using SAVEPOINT is a different matter. I do not know what advantage this will give you in your situation. As you work with Oracle10g, you might want to use the voluminous DML error log instead.
Alternatively, you can rewrite the driving request so that it works with smaller pieces of data. Without knowing more about the specifics of your process, I cannot give specific advice. But in general, instead of opening one cursor for 10,000 records, it would be better to open it twenty times in 500 lines of pop music. Another thing to consider is whether the insertion process can be made more efficient, say, using the mass collection and FORALL.
APC
source share