第一种 read uncommitted 此状态下脏读,不可重复读,虚读都有可能发生。此状态下两个人同时操作一个数据库表一边开启事务没有提交,另一边也开启事物开始更改数据但是也没有提交,此时第一个操作数据库的人在没有提交的情况下会看到另一边没有提交的数据,此时若第二个人不提交直接rollback数据回滚就会使数据变回原来的,这就是脏读。举例说用这种方式转账就很不安全,第一个人没有关闭事物就去查询账户发现钱多了,但是转账的人并没有提交,此时转账的人如果采用数据回滚就会使本来转好的钱回来。
第二种 read committed 此状态下避免了脏读,但是不可重复读,虚读都有可能发生。补充一点,这种事务隔离级别是oracle默认的。避免不可重复读,顾名思义,就是为了使第一个人在没有提交事物之前读取到的数据不可变,第二个人无论事物提没提交事物只要第一个人没有提交数据,那么第一个人查询到的数据都不会改变。
第三种是 repeatable read 此状态下避免了脏读,不可重复读,但是虚读是有可能发生。这种事物隔离级别是MySQL默认的,插入和修改数据只有在第一个人提交之后才可以查到,避免了数据的变动。
第四种是 serializable 此状态下避免了所有得问题但是效率降低了,一个人操作数据库的时候别人是无法修改的。
总结:
l 脏读:指一个线程中的事务读取到了另外一个线程中未提交的数据。
l 不可重复读:指一个线程中的事务读取到了另外一个线程中提交的update的数据。
l 虚读:指一个线程中的事务读取到了另外一个线程中提交的insert的数据