MySQL事务隔离级别

MySQL提供了四种隔离级别:

读未提交(Read Uncommitted)

读提交(Read Committed)

可重复读(Repeatable Read)

串行化(Serializable)

其中可重复读数MySQL默认的隔离级别,不同的隔离级别定义了不同的锁定方式,解决了不同的数据并发访问问题。

1.读未提交(Read Uncommitted)

在该隔离级别下,事务可以读取到其他未提交事务的修改数据。由于没有对读取的数据进行任何锁定,因此可能会导致脏读、不可重复读和幻象读的问题。该隔离级别建议在极少数情况下使用。

2.读提交(Read Committed)

在该隔离级别下,事务只能读取到已经提交的其他事务的数据,避免了脏读问题。但是由于其他事务的锁定,可能会出现不可重复读和幻象读的问题。

3.可重复读(Repeatable Read)

在该隔离级别下,事务在执行期间,多次读取同一条数据结果应该是一致的。MySQL使用了锁定机制,保证了该事务中读取的数据不会被其他事务修改。但是,如果该事务自己修改了数据,则其他事务仍会读取到旧的数据。

4.串行化(Serializable)

在该隔离级别下,所有的事务串行执行,避免了所有数据并发访问问题。虽然能够解决脏读、不可重复读和幻象读等问题,但是由于事务串行执行,导致了系统的响应时间变长,影响了系统的性能。

脏读、不可重复读、幻读举例:

脏读:

事务读取到了事务B未提交的数据,事务B有可能会把事务回滚,那么事务A读取的数据就是脏读;

不可重复读:

事务A读取id=1的一条记录(name=小白),事务B在事务A读取之后修改并提交id=1的记录(name=小黑),事务B继续读id=1的记录发现与前一次读取的数据不一致。

幻读:

事务A按照条件id=1查询数据时,没有对应的数据行,事务B插入一条id=1的数据,事务A在插入id=1的数据时,又发现这行数据已经存在,好像出现了 "幻影"。

你可能感兴趣的:(mysql,数据库,java)