auto commit
This commit is contained in:
parent
255aab0176
commit
8c5e412cc2
|
@ -25,17 +25,15 @@
|
|||
<!-- GFM-TOC -->
|
||||
|
||||
|
||||
|
||||
|
||||
# 一、事务
|
||||
|
||||
## 概念
|
||||
|
||||
<div align="center"> <img src="../pics//4f4deaf4-8487-4de2-9d62-5ad017ee9589.png"/> </div><br>
|
||||
|
||||
事务指的是一系列操作,并且满足 ACID 特性。
|
||||
事务指的是满足 ACID 特性的一系列操作。
|
||||
|
||||
在数据库中,可以通过 Commit 提交一个事务,也可以使用 Rollback 回退到一个保留点。
|
||||
在数据库中,可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回退。
|
||||
|
||||
## 四大特性
|
||||
|
||||
|
@ -55,7 +53,7 @@
|
|||
|
||||
<font size=4> **4. 持久性(Durability)** </font> </br>
|
||||
|
||||
一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。持久性通过数据库备份和恢复来保证。
|
||||
一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。可以通过数据库备份和恢复来保证持久性。
|
||||
|
||||
# 二、并发一致性问题
|
||||
|
||||
|
@ -69,19 +67,19 @@ T<sub>1</sub> 和 T<sub>2</sub> 两个事务同时对一个数据进行修改,
|
|||
|
||||
<font size=4> **2. 读脏数据** </font> </br>
|
||||
|
||||
T<sub>1</sub> 修改后写入数据库,T<sub>2</sub> 读取这个修改后的数据,但是如果 T<sub>1</sub> 撤销了这次修改,使得 T<sub>2</sub> 读取的数据是脏数据。
|
||||
T<sub>1</sub> 修改一个数据,T<sub>2</sub> 随后读取这个数据。如果 T<sub>1</sub> 撤销了这次修改,那么 T<sub>2</sub> 读取的数据是脏数据。
|
||||
|
||||
<div align="center"> <img src="../pics//d1ab24fa-1a25-4804-aa91-513df55cbaa6.jpg" width="800"/> </div><br>
|
||||
|
||||
<font size=4> **3. 不可重复读** </font> </br>
|
||||
|
||||
T<sub>2</sub> 读入某个数据,T<sub>1</sub> 对该数据做了修改,如果 T<sub>2</sub> 再读这个数据,该数据已经改变,和最开始读入的是不一样的。
|
||||
T<sub>2</sub> 读取一个数据,T<sub>1</sub> 对该数据做了修改。如果 T<sub>2</sub> 再次读取这个数据,此时读取的结果和和第一次读取的结果不同。
|
||||
|
||||
<div align="center"> <img src="../pics//d0175e0c-859e-4991-b263-8378e52f7ee5.jpg" width="800"/> </div><br>
|
||||
|
||||
<font size=4> **4. 幻影读** </font> </br>
|
||||
|
||||
T<sub>1</sub> 读某个范围的数据,T<sub>2</sub> 在这个范围内插入新的数据,T<sub>1</sub> 再读这个范围的数据,和最开始读入的就不一样了。
|
||||
T<sub>1</sub> 读取某个范围的数据,T<sub>2</sub> 在这个范围内插入新的数据,T<sub>1</sub> 再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同。
|
||||
|
||||
<div align="center"> <img src="../pics//d589eca6-c7cf-49c5-ac96-8e4ca0cccadd.jpg" width="800"/> </div><br>
|
||||
|
||||
|
@ -89,7 +87,7 @@ T<sub>1</sub> 读某个范围的数据,T<sub>2</sub> 在这个范围内插入
|
|||
|
||||
产生并发不一致性问题主要原因是破坏了事务的隔离性,解决方法是通过并发控制来保证隔离性。
|
||||
|
||||
并发控制可以通过封锁来实现,但是如果封锁操作都要程序员自己控制,那么就会相当复杂。数据库管理系统提供了事务的隔离级别,让用户以一种更轻松的方式处理并发一致性问题。
|
||||
并发控制可以通过封锁来实现,但是封锁操作都要用户自己控制,相当复杂。数据库管理系统提供了事务的隔离级别,让用户以一种更轻松的方式处理并发一致性问题。
|
||||
|
||||
# 三、封锁
|
||||
|
||||
|
@ -98,16 +96,15 @@ T<sub>1</sub> 读某个范围的数据,T<sub>2</sub> 在这个范围内插入
|
|||
排它锁 (X 锁)和共享锁 (S 锁),又称写锁和读锁。
|
||||
|
||||
- 一个事务对数据对象 A 加了 X 锁,就可以对 A 进行读取和更新。加锁期间其它事务不能对 A 加任何锁;
|
||||
|
||||
- 一个事务对数据对象 A 加了 S 锁,可以对 A 进行读取操作,但是不能进行更新操作。加锁期间其它事务能对 A 加 S 锁,但是不能加 X 锁。
|
||||
|
||||
## 封锁粒度
|
||||
|
||||
应该尽量只锁定需要修改的那部分数据,而不是所有的资源。锁定的数据量越少,发生锁争用的可能就越小,系统的并发程度就越高。
|
||||
|
||||
但是加锁需要消耗资源,锁的各种操作,包括获取锁,检查所是否已经解除、释放锁,都会增加系统开销。因此封锁粒度越小,系统开销就越大。需要在锁开销以及数据安全性之间做一个权衡。
|
||||
但是加锁需要消耗资源,锁的各种操作,包括获取锁,检查锁是否已经解除、释放锁,都会增加系统开销。因此封锁粒度越小,系统开销就越大。需要在锁开销以及数据安全性之间做一个权衡。
|
||||
|
||||
MySQL 中主要提供了两种封锁粒度:行级锁以及表级锁。
|
||||
MySQL 中提供了两种封锁粒度:行级锁以及表级锁。
|
||||
|
||||
## 封锁协议
|
||||
|
||||
|
@ -384,3 +381,4 @@ Entity-Relationship,有三个组成部分:实体、属性、联系。
|
|||
- 史嘉权. 数据库系统概论[M]. 清华大学出版社有限公司, 2006.
|
||||
- 施瓦茨. 高性能MYSQL(第3版)[M]. 电子工业出版社, 2013.
|
||||
- [MySQL 乐观锁与悲观锁 ](https://www.jianshu.com/p/f5ff017db62a)
|
||||
- [Transaction isolation levels](https://www.slideshare.net/ErnestoHernandezRodriguez/transaction-isolation-levels)
|
||||
|
|
Loading…
Reference in New Issue
Block a user