前言:
本篇文章将会说明什么是事务,为什么会出现事务?事务是怎么做的?
是什么?
我们以买火车票为例:
首先我们可以肯定的是买票这个动作不止一个人在做,也就是说是许多人并行的,不是串行的。
那么假设我们对买火车票数据库的CURD不加控制:
那么假设就剩一张票,有两个客户同时买票,客户端A买的时候发现还有一张,客户端B也发现还有一张,那么当他们买完之后,数据传回数据库,就会发现一张票被卖了两次。
问题:数据库的CURD要满足什么属性才能解决上述问题?
- 买票互相之间不能影响
- 买的票不重复且有效
- 买前买后状态确定,要么没买上,要么就买上了
接下来解释什么是事务:
事务就是一组SQL语句,这一组语句要么全部执行成功,要么全部失败,他们是一个整体,而且MySQL保证了我们能够达到这样的效果。
并且事务规定不同客户端看到的数据不同, 因为数据库不止一个事务在访问,而有可能多人同时访问一个表数据,我要改,他要查,她要删,对表数据不加保护的话就一定会出问题。
共享表单,几十人同时填写一个表单,一个人在填写自己的那一列时,别人是无法填写的,但是他又可以实时看到别人填写的东西,最重要的是,当你填写后,别人可以删改你填写的,共享表单的数据,谁也可以修改,那最后一定会出问题。
所以买火车票的数据库他一定有保护措施,并不会互相影响,被互相看到,互相删改。
那么他一定满足以下四个属性:
原子性:
一个事务要么就全部完成,要么就全部不完成,在事务执行过程中出现错误时,会回滚到事务开始前的状态,就像没执行过一样。
隔离性:
数据库允许多个并发事务同时对数据修改和读写,隔离性可以防止多个事务并发执行时由于交叉执行而导致的数据不一致。
事务隔离分为四个级别:
- 读未提交 (read uncommitted)
- 读提交 (read committed)
- 可重复读(repeatable)
- 串行化
持久性:
事务处理结束后,对数据的修改就是永久的,即使系统故障也不会丢失。
一致性:
由前三个属性保证,要求在事务前后,数据库的完整性不能受到破坏,即所有插入的数据都符合我们预设的条件。
为什么?
事务被MySQL编写者设计出来是为了简化我们编程,即不需要我们去考虑各种各样潜在的错误和并发问题,即要么我们操作成功,要么回滚,不用去考虑网络异常等问题,就很方便,因此事务不是天生就有的,本质是为了上层应用而诞生的。
另外,MySQL中只有innodb引擎支持事务,myisam是不支持的。(transaction表示事务)
怎么做?
- 手动提交
- 自动提交
查看事务提交方式
show variables lile 'autocommit'
用set来改变MySQL的自动提交方式
set autocommit = 0;
set autocommit = 1;
下节我们将使用一个简单银行用户表来进行事务的手动操作,对比自动和手动操作,对比不同隔离级别。