数据库AICD特性之--隔离性 Isolation
mysql, database, systems
mysql, database, systems
相关文章:数据库AICD特性之–原子性 Atomicity、数据库ACID特性之–持久性 Durability、数据库AICD特性之–一致性 Consistency。
隔离性 是指数据库的并发事务之间的可访问性问题。
首先我们需要知道隔离性问题是如何被引入的。如果只有单个事务的情况下,那么并不存在隔离性问题,当前事务中读到的数据永远是正确的。
而当多个事务并发时,则可能存在当前事务 T1 开启时,正在查询 A 表某条数据,同时另一个并发的事务 T2 又对 A 表的该数据做了修改,那么此时就会存在一些问题:
这种存在于多个并发事务之间的影响就叫作事务的隔离性问题。
通常数据库针对不同隔离级别的需求,拥有以下四种不同级别的隔离级别:
在实际使用中,需要根据不同需要设置隔离级别:
对于 MySQL,是使用 锁 + MVCC 来实现的。
相关设置:基于 MySQL 8.x。
查看事务隔离级别:
-- 查看全局隔离级别
select @@GLOBAL.transaction_isolation;
-- 查看当前会话隔离级别
select @@SESSION.transaction_isolation;
修改事务隔离级别:REPEATABLE READ、READ COMMITTED、READ UNCOMMITTED、SERIALIZABLE。
-- 修改当前会话隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
准备数据:
create table t1(c1 int, c2 varchar(50));
insert into t1 values (1, 'aaaa');
READ UNCOMMITTED。SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
START TRANSACTION;
select @@SESSION.transaction_isolation;
select * from t1 where c1 = 1;
START TRANSACTION;
update t1 set c2 = 'abcd' where c1 = 1;
select * from t1 where c1 = 1;
rollback;
select * from t1 where c1 = 1;
select * from t1 where c1 = 1;
commit;
从结果中可以看到,事务 1 中查询到了事务 2 没有提交时修改的数据。
READ COMMITTED。SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
START TRANSACTION;
select @@SESSION.transaction_isolation;
select * from t1 where c1 = 1;
START TRANSACTION;
update t1 set c2 = 'abcd' where c1 = 1;
select * from t1 where c1 = 1;
COMMIT;
select * from t1 where c1 = 1;
select * from t1 where c1 = 1;
COMMIT;
可以看到,事务 1 在事务 2 修改数据后但是没有提交时,没有查询到事务 2 修改的数据,在事务 2 提交后,事务 1 就可以查询到事务 2 修改的数据。
REPEATABLE READ。SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
t2 表进行验证。create table t2 (c1 int, c2 int);
insert into t2 values (1, 10);
insert into t2 values (2, 20);
START TRANSACTION;
select @@SESSION.transaction_isolation;
select * from t2 where c1 = 1;
c1 = 1 的数据。START TRANSACTION;
update t2 set c2 = 15 where c1 = 1;
insert into t2 values (1, 30);
select * from t2 where c1 = 1;
COMMIT;
select * from t2 where c1 = 1;
select * from t2 where c1 = 1;
COMMIT;
可以看到,事务 1 中的数据在事务 2 修改后查询结果仍然保持一致。
日志还会继续,欢迎常来。
返回首页