欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据库事务隔离级别的思考

程序员文章站 2022-04-08 18:52:32
...
首先说明下事务的四种隔离级别:读未提交、读已提交、可重复读、可串行化.

而且,在事务的并发操作中,可能出现脏读、不可重复读、幻读等.

读未提交:一个事务可以读取另一个事务没有提交的数据(**脏读**).

读已提交:一个事务只能读取到另一个事务提交的数据(可以解决脏读,但是一个事务中出现了**更新操作**,会导致数据不可重复读)

可重复读:开始事务后,不再允许修改数据(可以解决不可重复读的问题,但是**可能出现幻读**,比如说新增一条数据).

可串行化:事务串行化执行,可以避免脏读、不可重读读和幻读.

隔离级别的设置只对当前连接有效,对于使用MYSQL命令窗口而言,一个窗口就相当于一个连接,当前窗口设置的隔离级别只对当前窗口中的事务有效,对于JDBC操作数据库来说,一个Connection对象相当与一个连接,而对于Connection对象设置的隔离级别只对该Connection对象有效,与其他连接Connection对象无关

下面是我在 MySQL 数据库上的测试过程:

1.新开一个窗口,设置事务的隔离级别,然后在另一个窗口中查看,发现另一个窗口的事务隔离级别还是默认值.

SELECT @@tx_isolation;

set session transaction isolation level serializable;

start transaction;

insert into test values(1, 'pp2');

commit;

select * from test;

2.插入一条数据前开启事务,但是不提交,在另一个窗口中也插入一条数据,发现数据能插入进去,但是如果执行查询语句的话,则会被阻塞.

原因是和 MySQL 的底层存储结构有关,当事务操作的数据部分重叠时才会阻塞,如果不重叠则不会被阻塞.