1月阅读周·MySQL数据库入门:事务管理之事务的概念篇
背景
去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。
没有计划的阅读,收效甚微。
新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出1~2个非连续周,完整阅读一本书籍。
这个“玩法”虽然常见且板正,但是有效,已经坚持阅读十二个月。
已读完书籍:《架构简洁之道》、《深入浅出的Node.js》、《你不知道的JavaScript(上卷)》、《你不知道的JavaScript(中卷)》、《你不知道的JavaScript(下卷)》、《数据结构与算法JavaScript描述》、《WebKit技术内幕》、《前端架构:从入门到微前端》、《秒懂算法:用常识解读数据结构与算法》、《JavaScript权威指南》、《JavaScript异步编程设计快速响应的网络应用》、《编写可测试的JavaScript代码》。
当前阅读周书籍:《MySQL数据库入门》。
事务的概念
现实生活中,人们经常会进行转账操作,转账可以分为两部分来完成,转入和转出,只有这两个部分都完成才认为转账成功。在数据库中,这个过程是使用两条语句来完成的,如果其中任意一条语句出现异常没有执行,则会导致两个账户的金额不同步,造成错误。
为了防止上述情况的发生,MySQL中引入了事务,所谓事务就是针对数据库的一组操作,它可以由一条或多条SQL语句组成,同一个事务的操作具备同步的特点,如果其中有一条语句无法执行,那么所有的语句都不会执行,也就是说,事务中的语句要么都执行,要么都不执行。
在数据库中使用事务时,必须先开启事务,开启事务的语句具体如下:
START TRANSACTION;
上述语句就用于开启事务,事务开启之后就可以执行SQL语句,SQL语句执行成功后,需要使用相应语句提交事务,提交事务的语句具体如下:
COMMIT;
需要注意的是,在MySQL中直接书写的SQL语句都是自动提交的,而事务中的操作语句都需要使用COMMIT语句手动提交,只有事务提交后其中的操作才会生效。
如果不想提交当前事务还可以使用相关语句取消事务(也称回滚),具体语句如下:
ROLLBACK;
需要注意的是,ROLLBACK语句只能针对未提交的事务执行回滚操作,已提交的事务是不能回滚的。
通过上述的讲解,读者对事务有了一个简单的了解,为了让读者更好地学习事务,接下来通过一个转账的案例来演示如何使用事务。在演示之前,首先需要创建一个名称为chapter06的数据库,并且在chapter06中创建一个account表,插入相应的数据,SQL语句具体如下:
CREATE DATABASE chapter06;
USE chapter06;
CREATE TABLE account(
id INT primary key auto_increment,
name VARCHAR(40),
money FLOAT
);
INSERT INTO account(name,money) VALUES('a',1000);
INSERT INTO account (name, money) VALUES ('b', 1000);
为了验证数据是否添加成功,可以使用SELECT语句查询account表中的数据,查询结果如下:
mysql>SELECT * FROM account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|1 | a | 1000 |
|2 | b | 1000 |
+----+------+-------+
2 rows in set (0.00 sec)
从上述结果可以看出数据添加成功了,接下来使用事务来演示如何实现转账功能。
【例1-1】 首先开启一个事务,然后通过UPDATE语句将a账户的100元钱转给b账户,最后提交事务,具体语句如下:
START TRANSACTION;
UPDATE account SET money=money-100 WHERE NAME='a';
UPDATE account SET money=money+100 WHERE NAME='b';
COMMIT;
上述语句执行成功后,可以使用SELECT语句来查询account表中的余额,查询结果如下:
mysql>SELECT * FROM account;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 900 |
| 2 | b | 1100 |
+----+------+-------+
2 rows in set (0.00 sec)
从查询结果可以看出,通过事务成功地完成了转账功能。需要注意的是,上述两条UPDATE语句中如果任意一条语句出现错误就会导致事务不会提交,这样一来,如果在提交事务之前出现异常,事务中未提交的操作就会被取消,因此就可以保证事务的同步性。
事务有很严格的定义,它必须同时满足4个特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),也就是人们俗称的ACID标准,接下来就针对这4个特性进行讲解,具体如下。
1.原子性
原子性是指一个事务必须被视为一个不可分割的最小工作单元,只有事务中所有的数据库操作都执行成功,才算整个事务执行成功,事务中如果有任何一个SQL语句执行失败,已经执行成功的SQL语句也必须撤销,数据库的状态退回到执行事务前的状态。
2.一致性
一致性是指事务将数据库从一种状态转变为下一种一致的状态。例如,在表中有一个字段为姓名,具有唯一约束,即姓名不能重复,如果一个事务对姓名进行了修改,使姓名变得不唯一了,这就破坏了事务的一致性要求,如果事务中的某个动作失败了,系统可以自动撤销事务,返回初始化的状态。
3.隔离性
隔离性还可以称为并发控制、可串行化、锁等,当多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
4.持久性
事务一旦提交,其所做的修改就会永久保存到数据库中,即使数据库发生故障也不应该对其有任何影响。需要注意的是,事务的持久性不能做到100%的持久,只能从事务本身的角度来保证永久性,而一些外部原因导致数据库发生故障,如硬盘损坏,那么所有提交的数据可能都会丢失。
需要注意的是,针对事务的4个特性有个简单的印象就可以了,不必太过斟酌,事务的操作才是重点掌握的内容。
总结
事务处理机制在程序开发过程中有着非常重要的作用,它可以使整个系统更加安全,保证在同一个事务中的操作具有同步性。
在数据库中,这个过程是使用两条语句来完成的,如果其中任意一条语句出现异常没有执行,则会导致两个账户的金额不同步,造成错误。
为了防止上述情况的发生,MySQL中引入了事务,所谓事务就是针对数据库的一组操作,它可以由一条或多条SQL语句组成,同一个事务的操作具备同步的特点,如果其中有一条语句无法执行,那么所有的语句都不会执行,也就是说,事务中的语句要么都执行,要么都不执行。
作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏⭐️ | 留言📝。
- 点赞
- 收藏
- 关注作者
评论(0)