参考一个事务中 可以查询自己未提交的数据吗_最详细MySQL事务隔离级别及原理讲解!(二)-CSDN博客
一个事务中 可以查询自己未提交的数据吗_趣说数据库事务隔离级别与原理_weixin_39747293的博客-CSDN博客
【MySql:当前读与快照读】_当前读和快照读_QuietThinking的博客-CSDN博客
PostgreSQL实战之事务与并发控制(二)_postgresql 默认事务级别_auspicious航的博客-CSDN博客
当前事务默认级别:
SELECT current_setting ('default_transaction_isolation')
结果:read committed (读已提交)
一个事务的sql:
能读到当前事务修改的数据
- Begin transaction;
- -- SELECT * FROM "budget_base_config";
- SELECT sum(deadline) FROM "budget_base_config";
- update "budget_base_config" set deadline=12 where period='2023-07';
- -- SELECT * FROM "budget_base_config";
- SELECT sum(deadline) FROM "budget_base_config";
- commit;
结果 123 24
read committed级别能解决脏读问题。其他事务未提交的数据无法读取
2个事务
事务1未提交
- Begin transaction;
- SELECT sum(deadline) FROM "budget_base_config";
- update "budget_base_config" set deadline=11 where period='2023-07';
- SELECT sum(deadline) FROM "budget_base_config";
- -- commit;
结果121 21
事务2查询之前的数据
- Begin transaction;
- -- SELECT * FROM "budget_base_config";
- SELECT sum(deadline) FROM "budget_base_config";
结果121
但是read committed是不可重复读的,一个事务中读取的2次数据的时间间隔里因为另一个事务的提交,导致前后2次数据读取不一致
- 事务一执行
- Begin transaction;
- SELECT sum(deadline) FROM "budget_base_config";
-
- 结果121
-
- 事务二执行
- Begin transaction;
- update "budget_base_config" set deadline=11111 where period='2023-07';
- commit;
-
-
- 事务一再执行
- SELECT sum(deadline) FROM "budget_base_config";
-
- 结果
- 11121
设置当前会话的隔里级别为REPEATABLE READ(可重复读)
- 事务一执行
- START TRANSACTION ISOLATION LEVEL REPEATABLE READ;
- SHOW transaction_isolation;
- Begin transaction;
- SELECT sum(deadline) FROM "budget_base_config";
-
- 结果11121
-
- 事务二执行
- Begin transaction;
- update "budget_base_config" set deadline=1 where period='2023-07';
- SELECT sum(deadline) FROM "budget_base_config";
- commit;
-
- 结果11
-
- 事务一执行
- SELECT sum(deadline) FROM "budget_base_config";
-
- 结果11121
可见现在事务一前后读取数据一致