提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
数据库事务在数据库中占有极为重要的地位,包括简单的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
-
原子性(Atomicity)
事务中所有操作是不可再分割的原子单元。事务中所有操作要么都执行成功,要么都执行失败。
-
一致性(Consistency)
事务执行后,数据库状态与其他业务规则保持一致。如转账业务,无论事务执行成功与否,
参与转账的两个账户余额之和应该保持不变。 -
隔离性(Isolation)
隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会互相干扰。
-
持久性(Durability)
一旦事务提交成功,事务中所有的数据操作都必须被持久化保存到数据库中,即使提交事务后,
数据库崩溃,在数据库重启时,也必须能保证通过某种机制恢复。
三、不考虑隔离性会产生的三个问题
-
脏读
脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
-
不可重复读
一个事务两次读取同一行的数据,结果得到不同状态的结果,中间正好另一个事务更新了该数据,两次结果相异,不可被信任。通俗来讲就是:事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。
-
幻读(虚读)
一个事务执行两次查询,第二次结果集包含第一次中没有或某些行已经被删除的数据,造成两次结果不一致,只是另一个事务在这两次查询中间插入或删除了数据造成的。通俗来讲就是:例如事务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