在不考虑隔离性的前提下,事务的并发可能会出现的问题:
- 脏读:读到了其他事务未提交的数据。(必须避免这种情况)
- 不可重复读:同一事务中,多次查询同一数据,结果不一致,因为其他事务修改造成的。(一些业务中这种不可重复读不是问题)
- 幻读:同一事务中,多次查询同一数据,因为其他事务对数据进行了增删吗,导致出现了一些问题。(一些业务中这种幻读不是问题)
针对这些并发问题,关系型数据库有一些事务的隔离级别,一般用4种。
- READ UNCOMMITTED:读未提交(啥用没用,并且PGSQL没有,提供了只是为了完整性)
- READ COMMITTED:读已提交,可以解决脏读(PGSQL默认隔离级别)
- REPEATABLE READ:可重复读,可以解决脏读和不可重复读(MySQL默认是这个隔离级别,PGSQL也提供了,但是设置为可重复读,效果还是串行化)
- SERIALIZABLE:串行化,啥都能解决(锁,效率慢)
PGSQL在老版本中,只有两个隔离级别,读已提交和串行化。在PGSQL中就不存在脏读问题。