From 8d22d955428168cda22a824942194edd3f1ff2ac Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Thu, 22 Mar 2018 16:06:40 +0800 Subject: [PATCH] auto commit --- notes/数据库系统原理.md | 57 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 50 insertions(+), 7 deletions(-) diff --git a/notes/数据库系统原理.md b/notes/数据库系统原理.md index 71ae0182..a497aa6b 100644 --- a/notes/数据库系统原理.md +++ b/notes/数据库系统原理.md @@ -124,8 +124,8 @@ MySQL 中提供了两种封锁粒度:行级锁以及表级锁。 | - | X | S | | :--: | :--: | :--: | -|X|YES|No| -|S|No| No| +|X|Yes|No| +|S|No|No| ### 2. 意向锁 @@ -140,10 +140,10 @@ MySQL 中提供了两种封锁粒度:行级锁以及表级锁。 | - | X | IX | S | IS | | :--: | :--: | :--: | :--: | :--: | -|X |NO |NO |NO | NO| -|IX |NO |YES|NO | YES| -|S |NO |NO |YES| YES| -|IS |NO |YES|YES| YES| +|X |No |No |No | No| +|IX |No |YES|No | Yes| +|S |No |No |Yes| Yes| +|IS |No |Yes|Yes| Yes| ## 封锁协议 @@ -155,19 +155,62 @@ MySQL 中提供了两种封锁粒度:行级锁以及表级锁。 可以解决丢失修改问题,因为不能同时有两个事务对同一个数据进行修改,那么一个事务的修改就不会被覆盖。 +| T1 | T1 | +| :--: | :--: | +| lock-x(A) | | +| read A=20 | | +| | lock-x(A) | +| | wait | +| write A=19 | | +| commit | | +| unlock-x(A) | | +| | obtain | +| | read A=19 | +| | write A=21 | +| | commit | +| | unlock-x(A)| + **二级封锁协议** 在一级的基础上,要求读取数据 A 时必须加 S 锁,读取完马上释放 S 锁。 可以解决读脏数据问题,因为如果一个事务在对数据 A 进行修改,根据 1 级封锁协议,会加 X 锁,那么就不能再加 S 锁了,也就是不会读入数据。 +| T1 | T1 | +| :--: | :--: | +| lock-x(A) | | +| read A=20 | | +| write A=19 | | +| | lock-s(A) | +| | wait | +| rollback | | +| A=20 | | +| unlock-x(A) | | +| | obtain | +| | read A=20 | +| | commit | +| | unlock-s(A)| + **三级封锁协议** 在二级的基础上,要求读取数据 A 时必须加 S 锁,直到事务结束了才能释放 S 锁。 可以解决不可重复读的问题,因为读 A 时,其它事务不能对 A 加 X 锁,从而避免了在读的期间数据发生改变。 -

+| T1 | T1 | +| :--: | :--: | +| lock-s(A) | | +| read A=20 | | +| |lock-x(A) | +| | wait | +| read A=20| | +| commit | | +| unlock-s(A) | | +| | obtain | +| | read A=20 | +| | write A=19| +| | commit | +| | unlock-X(A)| ### 2. 两段锁协议