这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战
前言
在上篇文章中,我们提到了数据库事务在客户端并发访问的时候会产生3类问题,那么今天我们就要探究数据库是如何解决这三类问题。
数据库锁
在我们日常的业务开发中,解决并发产生的问题,首先想到的一种方式,肯定是加锁,控制并发访问的线程。那么,数据库也是通过锁机制解决并发访问的问题。按照锁定的对象不同,一般可以分为表锁定和行锁定。顾名思义,表锁定对整张表进行锁定,行锁定对表中的特定行进行锁定。从另一个方面锁的关系中也可以分为共享锁定和独占锁定,共享锁定会防止独占锁定,但是允许其他的共享锁定。独占锁定防止其他的独占锁定并且也防止共享锁定。更改数据行必须要使用独占锁定。INSERT,UPDATE,DELETE语句都会隐式采用必要的行锁定。数据库常用的5种锁定(Oracle数据库):
- 行共享锁定:行共享锁定并不防止对数据行进行更改操作,但是可以防止其他会话获取独占性数据表锁定。允许进行多个并发的行共享锁定和行独占锁定,允许数据表的共享锁定或者采用共享行独占锁定。
- 行独占锁定:行独占锁定防止其他会话获取一个共享锁定,共享行独占锁或独占锁定
- 表共享锁定:表共享锁定可以防止其他会话获取行独占锁定,防止其他表共享行独占锁定或表锁定,但是允许表中拥有多个行共享锁定或者表共享锁定。该锁定让会话具有对表事务级一致性访问。
- 表共享行独占锁定:这种锁定可以防止其他会话获取表共享,行独占或者表独占锁定,允许其他行共享锁定。
- 表独占锁定:表独占锁定可以防止其他会话对该表的任何其他锁定。
事务隔离级别
通过这些锁的了解,我们如果直接使用这些锁进行并发事务的控制的话,是会非常麻烦的。所以数据库为用户提供了自动锁的机制。只要用户指定了对应的事务隔离级别,数据库就会自动为事务操作的数据添加合适的锁。数据库提供了4个等级的事务隔离级别,如以下表格:
| 隔离级别 | 脏读 | 不可重复读 | 幻象读 |
|---|---|---|---|
| READ UNCOMMITED | 允许 | 允许 | 允许 |
| READ COMMITED | 不允许 | 允许 | 允许 |
| REPEATABLE READ | 不允许 | 不允许 | 允许 |
| SERIALIZABLE | 不允许 | 不允许 | 不允许 |
推荐使用REPEATABLE READ来保证数据读的一致性。也可以根据具体的使用场景选择合适的事务隔离级别
结语
今天我们了解了数据库如何解决并发问题的基本方式