01.22 Day 3 - 事务隔离级别与实现

大家好,我是 Snow Hide,作为《MySQL 实战》这个专栏的学员之一,这是我打卡的第 3 天,也是我第 41 次进行这种操作。

今天我温习了该专栏里一篇叫《事务隔离:为什么你改了我还看不见?》的文章。

关键词总结:隔离性与隔离级别、(隔离级别(读未提交、读提交、可重复读、串行化)、隔离级别的事务效果(读未提交、读提交、可重复读、串行化))、事务隔离的实现、事务的启动方式(显式启动、隐式启动)。

所学总结:

隔离性与隔离级别

用以解决脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)等问题。

隔离级别

SQL 标准的事务隔离级别有:读未提交(read uncommitted)、读提交(read committed)、可重复读(repeatable read)以及串行化(serializable)。

读未提交

事务提交之前其所做的变更可被其他事务看见。

读提交

事务提交之后其所做的变更才可被其他事务看见。

可重复读

事务执行过程看到的数据总是和事务在启动时看到的数据一致。事务提交之前其所做的变更对其他事务不可见。

扫描二维码关注公众号,回复: 8788463 查看本文章

串行化

对于同一条记录,写时加写锁,读时加读锁。出现读写锁冲突时需要等事务执行完成才能继续。

隔离级别的事务效果

读未提交

虽然事务 B 还未提交,但事务 A 能看到其结果。

读提交

事务 B 的更新在提交后才能被事务 A 所看到。

可重复读

事务在执行期间看到的数据在提交前后必须是一致的。

串行化

事务 B 无法操作事务 A 正在操作的数据,等事务 A 提交并释放锁后,事务 B 才能继续。
 

事务隔离的实现

每条记录在更新的时候都会同时记录一条回滚操作。通过回滚操作,记录上的最新值可以得到前一个状态的值。
 

事务的启动方式

显式启动

通过 begin 或 start transaction 的语句开始,以 commit 结尾或异常时以 rollback 结束。

隐式启动

将 set autocommit 设置为 0 时会讲线程自动提交关闭,当执行 select 语句时就触发了事务,该事务会一直存在直至遇到 commit 或 rollback 语句或断开与数据库的连接。
这是通常所说的长连接。建议将 set autocommit 设置为 1,并在 CUD 时显式启动事务。频繁使用事务的地方可以使用 commit work and chain 语法,其作用时将当前事务提交并立即开启下一个事务,从而省去再次调用 begin 语句所带来的开销。
 

末了

重新总结了一下文中提到的内容:事务隔离级别的现象和实现、长事务存在的风险、通过正确方式避免长事务。

发布了77 篇原创文章 · 获赞 6 · 访问量 1615

猜你喜欢

转载自blog.csdn.net/stevenchen1989/article/details/104067370