From Wikipedia (which has great and detailed examples for this):
A non-repeatable read occurs, when during the course of a transaction, a row is retrieved twice and the values within the row differ between reads.
A phantom read occurs when, in the course of a transaction, two identical queries are executed, and the collection of rows returned by the second query is different from the first.
- User A runs the same query twice.
- In between, User B runs a transaction and commits.
- Non-repeatable read: The A row that user A has queried has a different value the second time.
- Phantom read: All the rows in the query have the same value before and after, but different rows are being selected (because B has deleted or inserted some). Example:
select sum(x) from table;will return a different result even if none of the affected rows themselves have been updated, if rows have been added or deleted.
In the above example,which isolation level to be used?
What isolation level you need depends on your application. There is a high cost to a “better” isolation level (such as reduced concurrency).
In your example, you won’t have a phantom read, because you select only from a single row (identified by primary key). You can have non-repeatable reads, so if that is a problem, you may want to have an isolation level that prevents that. In Oracle, transaction A could also issue a SELECT FOR UPDATE, then transaction B cannot change the row until A is done.