运维开发中,对于数据库事务的隔离级别的认识(后续会更详细)

基于上篇文章中说道数据库事务的隔离级别,只是简单提了一下概念(地址:https://blog.csdn.net/qq_31565687/article/details/104139314);
本篇文章着重较详细地谈谈数据库事务的隔离级别。

坚持每天学习

我们一定要说积极向上的话。只要持续使用非常积极的话语,就能积累起相关的重要信息,于是在不经意之间,我们就已经行动起来,并且逐渐把说过的话变成现实。

一.对于基础概念的认知

1.什么是数据库事务?
Transaction(事务)是并发控制的基本单位;
通俗的讲:事务是一个操作序列,这些操作在运行的过程中,要么是全部都不执行,或是全部都执行。他们整个的操作顺序都是不能断开的。(注:事务是维护数据库数据一致性的基本单位,当我们结束某个事务时,都应该能保持数据一致性)

我们以Msql数据库的操作为例,再进一步解释一下数据库事务:
首先我们用以下命令查看该Mysql会话的事务隔离级别,关于事务隔离级别及其作用,我们在后面的章节中会进行详细介绍,这里只要简单知道数据库可以设置不同的事务隔离级别,不同的隔离级别会对事务的操作产生不同的效果即可。使用以下命令可以查询当前Mysql会话的事务隔离级别,可以看到,Mysql默认的事务隔离级别是REPEATABLE-READ。

mysql> select @@tx_isolation;
±----------------+
| @@tx_isolation |
±----------------+
| REPEATABLE-READ |
±----------------+

为了用实例来解释事务,我们创建了如下的bank数据表,并插入一条数据,
mysql> describe bank;
±--------±--------------±-----±----±--------±---------------+
| Field | Type | Null | Key | Default | Extra |
±--------±--------------±-----±----±--------±---------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(40) | NO | | NULL | |
| balance | decimal(10,2) | YES | | NULL | |
±--------±--------------±-----±----±--------±---------------+
mysql> select * from bank;
±—±-----±--------+
| id | name | balance |
±—±-----±--------+
| 3 | fufu | 2000.00 |
±—±-----±--------+

使用start transaction命令开启数据库事务,
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

更新id为3的行的balance值为3000.00,
mysql> update bank set balance = 3000 where id = 3;
Query OK, 1 row affected (0.09 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from bank;
±—±-----±--------+
| id | name | balance |
±—±-----±--------+
| 3 | fufu | 3000.00 |
±—±-----±--------+
1 row in set (0.00 sec)

此时我们可以看到,select语句查询到的id为3的行的balance值已经修改为3000.00,接下来我们再尝试插入一条新数据,
mysql> insert into bank (name, balance) values (‘melo’, 1000);
Query OK, 1 row affected (0.06 sec)
mysql> select * from bank;
±—±-----±--------+
| id | name | balance |
±—±-----±--------+
| 3 | fufu | 3000.00 |
| 4 | melo | 1000.00 |
±—±-----±--------+
2 rows in set (0.00 sec)

由于以上的update和insert操作都是在start transaction命令开启事务之后,所以直到事务结束,这些操作都属于同一事务,假设我们在insert操作时产生了错误,可以根据事务的定义得知,这些属于同一事务的所有操作要么都执行要么都不执行,我们可以验证一下,使用rollback命令,模拟事务失败回滚,
mysql> rollback;
Query OK, 0 rows affected (0.01 sec)

此时我们在查询数据库中的所有数据,发现数据恢复到了update命令执行前的状态,id为3的行的balance值等于2000没有变化。
mysql> select * from bank;
±—±-----±--------+
| id | name | balance |
±—±-----±--------+
| 3 | fufu | 2000.00 |
±—±-----±--------+
1 row in set (0.00 sec)

到此,我们阐述了数据库事务的定义并用简单的Mysql操作说明了事务的操作方式,我们可以总结出数据库事务的生命周期如下:
在这里插入图片描述

2.可以看出事务的边界包括:

事务的开始边界
事务的正常结束边界(COMMIT),提交事务,永久保存被事务更新后的数据库状态。
事务的异常结束边界(ROLLBACK):撤销事务,使数据库退回到执行事务前的初始状态。

思考:示例中的所有操作都是在一个Mysql会话中进行的,也就是没有其他用户在同时连接数据库进行操作,在这种没有并发会话的使用场景中,无论事务是正常结束还是异常结束,对于该单独用户读取数据不会造成任何影响,因为他的所有操作都是串行的。但是在实际应用场景中,数据库每时每刻都服务于很多会话,假设用户A的事务A开始后更新了数据库数据,此时用户B开始读取该数据,用户B将会读取到了新的值。但是如果紧接着事务A在下一条SQL语句操作时产生了错误,将事务A回滚了,那么用户B读取到的数据就是错误的无效数据了。这只是数据库事务在并发环境下会产生的一个简单的问题,所以接下来详细阐述并发事务会产生的问题

二. 事务隔离级别

以上就是数据库并发事务导致的五大问题,总结来说其中两类是更新问题,三类是读问题,数据库是如何避免这种并发事务问题的呢?

答案就是通过不同的事务隔离级别,在不同的隔离级别下,并发事务读取数据的结果是不一样的,比如在脏读小节里介绍的,如果是在REPEATABLE-READ隔离级别下,A事务在T5时刻读取是读取不到B事务未提交的数据的。我们需要根据业务的要求,设置不同的隔离级别,在效率和数据安全性中找到平衡点。

SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。

3.1 SERIALIZABLE(串行化)

当数据库系统使用SERIALIZABLE隔离级别时,一个事务在执行过程中完全看不到其他事务对数据库所做的更新。当两个事务同时操作数据库中相同数据时,如果第一个事务已经在访问该数据,第二个事务只能停下来等待,必须等到第一个事务结束后才能恢复运行。因此这两个事务实际上是串行化方式运行。

3.2 REPEATABLE READ(可重复读)

当数据库系统使用REPEATABLE READ隔离级别时,一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,但是不能看到其他事务对已有记录的更新。

3.3 READ COMMITTED(读已提交数据)

当数据库系统使用READ COMMITTED隔离级别时,一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,而且还能看到其他事务已经提交的对已有记录的更新。

3.4 READ UNCOMMITTED(读未提交数据)

当数据库系统使用READ UNCOMMITTED隔离级别时,一个事务在执行过程中可以看到其他事务没有提交的新插入的记录,而且还能看到其他事务没有提交的对已有记录的更新。

以上的四种隔离级别按从高到底排序,你可能会说,选择SERIALIZABLE,因为它最安全!没错,它是最安全,但它也是最慢的!四种隔离级别的安全性与性能成反比!最安全的性能最差,最不安全的性能最好!

总结

对于数据库事务的隔离级别:根据自身的理解,及其借鉴大牛的丰富经验解,简单记录了一下!
本来想详细的写一下!但是在写的过程中发现,自己对于隔离级别的理解,还有很多的问题与不足。希望通过不断的学习,过段时间能够“真真意义上”写出高质量的文章
(如果该过程中,有些内容与其他作者的重复,希望担待…)
(注:该文章内容部分参考于https://juejin.im/post/5b90cbf4e51d450e84776d27)

发布了11 篇原创文章 · 获赞 2 · 访问量 2486

猜你喜欢

转载自blog.csdn.net/qq_31565687/article/details/104159062
今日推荐