数据库事务隔离级别的思考
程序员文章站
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 的底层存储结构有关,当事务操作的数据部分重叠时才会阻塞,如果不重叠则不会被阻塞.
而且,在事务的并发操作中,可能出现脏读、不可重复读、幻读等.
读未提交:一个事务可以读取另一个事务没有提交的数据(**脏读**).
读已提交:一个事务只能读取到另一个事务提交的数据(可以解决脏读,但是一个事务中出现了**更新操作**,会导致数据不可重复读)
可重复读:开始事务后,不再允许修改数据(可以解决不可重复读的问题,但是**可能出现幻读**,比如说新增一条数据).
可串行化:事务串行化执行,可以避免脏读、不可重读读和幻读.
隔离级别的设置只对当前连接有效,对于使用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 的底层存储结构有关,当事务操作的数据部分重叠时才会阻塞,如果不重叠则不会被阻塞.
上一篇: Java的第6天,学习运算符
下一篇: MySQL事务,这篇文章就够了