数据库事务知识点梳理

本文深入探讨了数据库事务的基础,包括事务的定义、语法示例以及ACID四大特性。通过实例展示了事务如何确保数据一致性,同时阐述了不考虑隔离性可能引发的脏读、不可重复读和幻读问题。最后,简要提到了MVVC机制对事务的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

数据库事务在数据库中占有极为重要的地位,包括简单的CRUD都可以看作单一逻辑操作的事务。学习事务可以更好的扩展数据库的特性,可以帮助我们更遍历实现物业逻辑,如很多场景下需要保证数据一致性的并发操作。


提示:以下是本篇文章正文内容,下面案例可供参考

一、数据库事务

1、定义

数据库事务是构成单一逻辑工作单元的操作集合, 批量完成一系列对数据库的命令操作。

2、语法

代码如下(示例):

mysql> select * from top_user;
+----+------+---------------+---------+--------+----------+------------+-------------+-------------+-------+-------------+--------------+------------+---------------------+----------------------------------+
| ID | NAME | CODE          | RZ_CODE | ORG_ID | PASSWORD | USER_TYPE  | CONTACT_TEL | MOBILE      | EMAIL | UPDATE_TIME | LOGIN_NUMBER | LOCK_TIME  | LOGIN_FAILED_NUMBER | SINGLE_LOGIN_CODE                |
+----+------+---------------+---------+--------+----------+------------+-------------+-------------+-------+-------------+--------------+------------+---------------------+----------------------------------+
| 1  | 李英 | liying@qq.com | 011     | 115    | 123456   | 开发工程师 | 13727046088 | 13727046088 | NULL  | NULL        | NULL         | NULL       | NULL                | NULL                             |
| 2  | 李英 | liying@qq.com | 010     | 111    | 123456   | 开发工程师 | 13727046088 | 13727046088 |       | 2019-09-11  | NULL         | 2019-06-18 |                   0 | be91cb8498e80b14f7159da72b457130 |
| 3  | 詹姆 | zhanmu@qq.com | 012     | 222    | 123456   | 开发工程师 | 13727046088 | 13727046088 |       | 2019-09-06  | NULL         | NULL       | NULL                | NULL                             |
+----+------+---------------+---------+--------+----------+------------+-------------+-------------+-------+-------------+--------------+------------+---------------------+----------------------------------+
3 rows in set (0.02 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> delete from top_user;
Query OK, 3 rows affected (0.00 sec)
mysql> select * from top_user;
Empty set

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from top_user;
+----+------+---------------+---------+--------+----------+------------+-------------+-------------+-------+-------------+--------------+------------+---------------------+----------------------------------+
| ID | NAME | CODE          | RZ_CODE | ORG_ID | PASSWORD | USER_TYPE  | CONTACT_TEL | MOBILE      | EMAIL | UPDATE_TIME | LOGIN_NUMBER | LOCK_TIME  | LOGIN_FAILED_NUMBER | SINGLE_LOGIN_CODE                |
+----+------+---------------+---------+--------+----------+------------+-------------+-------------+-------+-------------+--------------+------------+---------------------+----------------------------------+
| 1  | 李英 | liying@qq.com | 011     | 115    | 123456   | 开发工程师 | 13727046088 | 13727046088 | NULL  | NULL        | NULL         | NULL       | NULL                | NULL                             |
| 2  | 李英 | liying@qq.com | 010     | 111    | 123456   | 开发工程师 | 13727046088 | 13727046088 |       | 2019-09-11  | NULL         | 2019-06-18 |                   0 | be91cb8498e80b14f7159da72b457130 |
| 3  | 詹姆 | zhanmu@qq.com | 012     | 222    | 123456   | 开发工程师 | 13727046088 | 13727046088 |       | 2019-09-06  | NULL         | NULL       | NULL                | NULL                             |
+----+------+---------------+---------+--------+----------+------------+-------------+-------------+-------+-------------+--------------+------------+---------------------+----------------------------------+
3 rows in set (0.04 sec)

二、事务特性ACID

  1. 原子性(Atomicity)

    事务中所有操作是不可再分割的原子单元。事务中所有操作要么都执行成功,要么都执行失败。

  2. 一致性(Consistency)

    事务执行后,数据库状态与其他业务规则保持一致。如转账业务,无论事务执行成功与否,
    参与转账的两个账户余额之和应该保持不变。

  3. 隔离性(Isolation)

    隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会互相干扰。

  4. 持久性(Durability)

    一旦事务提交成功,事务中所有的数据操作都必须被持久化保存到数据库中,即使提交事务后,
    数据库崩溃,在数据库重启时,也必须能保证通过某种机制恢复。

三、不考虑隔离性会产生的三个问题

  1. 脏读

    脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。

  2. 不可重复读

    一个事务两次读取同一行的数据,结果得到不同状态的结果,中间正好另一个事务更新了该数据,两次结果相异,不可被信任。通俗来讲就是:事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。

  3. 幻读(虚读)

    一个事务执行两次查询,第二次结果集包含第一次中没有或某些行已经被删除的数据,造成两次结果不一致,只是另一个事务在这两次查询中间插入或删除了数据造成的。通俗来讲就是:例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。
    事实上,MVVC控制已经可以解决部分幻读问题,而剩余部分则是因为当前读机制导致。

下面解释一下MVVC机制下的快照读当前读
快照读:

读取的是快照版本,也就是历史版本
		简单的select操作(当然不包括 select … lock in share mode, select … for update)

当前读:

读取的是最新版本;
	UPDATE、DELETE、INSERT、SELECT …  LOCK IN SHARE MODE、SELECT … FOR UPDATE是当前读。

总结

最后,对数据库事务隔离级别及实现原理作一个简单图示:

在这里插入图片描述
附上一篇对数据库事务及原理讲解的链接: https://www.cnblogs.com/takumicx/p/9998844.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西瓜皮防摔

做最明亮的自己,然后照亮他人

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值