I have the following domain object:
void insertBulkCats(Collection<Cat> cats)
Connection conn = getConnection();
PreparedStatement statement = new PreparedStatement();
for(Cat cat : cats)
PreparedStatement mergeStatement = conn.prepareStatement(MERGE_CATS);
PreparedStatement dropStatement = conn.prepareStatement(CLEAR_CATS);
Atomicity is a feature of ACID DBMS. It is automatic in Oracle : run all your DML (update/insert/delete), once you are done issue a commit. You are guaranteed that the operations will be saved as an indivisible transaction (if the commit fails nothing is saved).
In JDBC you have to make sure to turn off autocommit.
Concerning concurrency, it is also an integrated feature of most DBMS, although the behaviours of locking can be different among major DBMS.
In Oracle writes don't block reads, although other transactions won't see your changes until you have committed: this isolation is implemented via multi-versionning. The locking mechanism of DML is at the row level. Only one transaction can modify a row at the same time. A common pattern in Oracle for a unit of work would be:
FOR UPDATE. This will put a lock on the rows and other transactions won't be able to modify these rows until you commit or rollback.
Locking a whole table is rare in Oracle, although it is a possibility. The LOCK TABLE command can be used to prevent any modification from other sessions to an entire table.