如果对表中的数据进行CRUD操作时,不加控制,会带来一些问题。
比如下面这种场景:

有一个tickets表,这个数据库被两个客户端机器A和B用时连接对此表进行操作。客户端A检查tickets表中还有一张票的时候,将票出售了,而火车票的总数是一个固定值,客户端A此时还没有来得及更新数据库
这时客户端B检查了票数,发现还有一张,又卖了一次票。这种情况,就出现了同一张票被卖了两次的场景。
这就是在进行CRUD时,不加控制带来的问题。
只要当进进行CRUD时满足以下属性,才能解决上面的问题:
- 买票的过程得是原子的
- 买票互相应该不能影响
- 买完票应该要永久有效
- 买前,和买后都要是确定的状态
而MySQL的事务机制,就能够有效的解决此问题。
1. MySQL事务
事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部失败,是一个整体。
MySQL提供一种机制,保证我们达到这样的效果。事务还规定不同的客户端看到的数据是不相同的。
事务就是要做的或所做的事情,主要用于处理操作量大,复杂度高的数据。假设一种场景:你毕业了,学校的教务系统后台MySQL中,不再需要你的数据,要删除你的所有信息, 那么要删除你的基本信息(姓名,电话,籍贯等)的同时,也删除和你有关的其他信息,比如:你的各科成绩,你在校表现,甚至你在论坛发过的文章等。这样,就需要多条 MySQL 语句构成,那么所有这些操作合起来,就构成了一个事务。
一个 MySQL数据库,可不止一个事务在运行,同一时刻,甚至有大量的请求被包装成事务,在向MySQL服务器发起事务处理请求。而每条事务至少一条 SQL ,最多很多SQL ,这样如果大家都访问同样的表数据,在不加保护的情况,就绝对会出现问题。甚至,因为事务由多条SQL构成,那么,也会存在执行到一半出错或者不想再执行的情况,那么已经执行的怎么办呢?
所以一个完整的事务,不仅仅是简单的DML组合而成,还要满足以下4个特点:
- 原子性(Atomicity) :事务中的所有操作要么全部完成,要么全部不完成。
- 一致性(Consistency) :事务执行前后,数据库的状态必须保持一致。
- 隔离性(Isolation) :一个事务的执行不能被其他事务干扰。
- 持久性(Durability) :一旦事务提交,其对数据库的修改应该永久保存。
以上 四个属性可以简称为ACID。
所以事务就是一条或者多条SQL语句组成并包含ACID。
有了事务这种机制后,能够简化我们的编程模型, 不需要我们去考虑各种各样的潜在错误和并发问题.可以想一下当我们使用事务时,要么提交,要么回滚,我 们不会去考虑网络异常了,服务器宕机了,同时更改一个数据怎么办对吧?因此事务本质上是为了应用层服 务的.而不是伴随着数据库系统天生就有的。
1.1 MySQL事务支持的版本
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务, MyISAM不支持。
使用show engines可以查看。

1.2 事务的提交方式
事务的提交方式常见的有两种
- 自动提交
- 手动提交
使用show variables like 'autocommit';可以查看事务提交的方式。

ON表示为自动提交。
可以通过set autocommit来更改自动提交模式。值为0,表示禁止自动提交。

值为1,表示开启自动提交。

1.3 事务常见的操作方式
为了方便演示,这里创建一张测试表account。
create table if not exists account(
id int

最低0.47元/天 解锁文章
6358

被折叠的 条评论
为什么被折叠?



