JDBC定义五种隔离级别:
TRANSACTION_NONE JDBC:不支持事务
TRANSACTION_READ_UNCOMMITTED
TRANSACTION_READ_COMMITTED
TRANSACTION_REPEATABLE_READ
TRANSACTION_SERIALIZABLE
未提交读(Read Uncommitted):读取到其他未提交事务修改的数据。会产生脏读,不可重复读,幻读。
脏读:A事务读取B事务未提交的更改数据,B事物回滚,A事务做其他操作。
已提交读(Read Committed):只能读取到已经提交的数据 。会产生不可重复读,幻读。
不可重复读:A事务读取B事务已经提交的数据,导致前后两次读不一致。
可重复读(Repeated Read):同一事务中多次读取到的同样数据的结果是一致的,其他事务不能更改所选数据,但可以更改其他数据(修改或删除)。
幻读:A事务读取B事务更改的其他更改数据(修改或删除)。
串行化(Serializable):所有事务一个接着一个的执行。不会产生脏读,不可重复读,幻读。
实现方法:
基于锁来实现并发控制的数据库,串行化要求在执行范围查询的时候,需要获取范围锁。
不是基于锁实现并发控制的数据库,检查到有违反串行操作的事务时,需回滚该事务。
InnoDB默认隔离级别Repeated Read采用Next-key Lock解决幻读问题,MVCC通过读取不同版本的数据来解决不可重复读问题。