什么是事务
* 简单来说就是:做一件事件必须有有头有尾,一旦开始,只有两种结果,要么失败,要么成功,而不能出现成功了部分失败了部分。
* 专业点说就是:一个事务必须具备 ACID属性,所谓得 ACID即:
1. Atomicity--原子性:
事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
2. Consistency--一致性
事务进行过后和执行前,所有数据都是预期一致的(一致性的理解有很多,大概是这样子的)
3. Isolation--隔离性
并发得事务之间不会互相影响,
4. Durability--持久性
一个事务成功了,那么他的的改变应该是永久性的。
为什么要事务
这个其实用脚趾头想想也知道它的重要性,举个简单的例子:
一个用户提交了一个订单,那么这条数据包含了两个信息,用户信息 和购买的 商品信息,我需要把他们分别存到 用户表 和
商品表,如果不采用事务,可能会出现,商品信息插入成功,而用户信息没有,这时候就会出现无主商品了,用户付了钱,却得不到商品,这就尴尬了,而如果采用事务,就可以保证,用户信息
和 商品信息 都必须插入成功,该次事务才算成功,那就不会出现这种问题了
支持事务的引擎
有时候事务并不一定是必须的,为了提升查询效率,有些mysql引擎是不支持事务的,比如 MyISAM,当然目前新版(好像是5.6以后)默认的引擎是
innoDB 是支持事务的,一般为了提升mysql速度,也会做读写分离,因为事务一般是针对写来说的。
事务的使用
我们主要从以下几个术语开始:
*
事务(transaction)执行一组SQL语句;
start transaction即可开始一个事务
*
回退(rollback)撤销指定SQL语句的过程;
rollback即可回退一个事务:rollback 必须是在一个事务里面才能使用,没有事务,就不能谈回退
*
提交(commit)将未存储的SQL语句结果写入数据库表;
commit使用 commit 来结束一个事务的处理:一般使用事务,我们需要自己手动提交,mysql 默认是自动提交的,所以我们需要设置set
autocommit = 0来更改提交模式。其中值得注意的是 rollback也会触发提交事务
*
保留点(savepoint)指事务处理中设置的临时占位符(placeholder),然后你就可以回退到该点。
savepoint s1生成一个保留点,然后可以通过 rollback to s1来回退到 s1 这个保留点
实例
讲了这么多,不来一个实例操作一下,实在是不舒心。。。。下面你可以打开你的mysql 库,按照下面步骤来操作一下,加深下理解:
* truncate info:
先清除一下表,记得用测试表噢,数据没了可别赖我
* select * from info:
查询一下,这里表应该是空的了
* start transaction:
开启一个事务,正式我们的测试
* insert into info values(1,"s1 before",20181019):
插入一条数据 “s1 before”
* savepoint s1:
创建一个保留点
* insert into info values(1,"s1 after",20181019):
再插入一条数据 “s1 after”
* select * from info:
查询看一下数据,此时应该是可以看到我们上面插入的两条数据。但是你要知道,这两条数据是没有正式入库的,他们只存在你的这个session里面,因为我们的事务还没提交呢。。。不信?你重开一个客户端,查看一下这个表,还是空的噢。
* rollback to s1:
回滚到 s1 保留点。
* select * from info:
这个时候你应该是只能看到 “s1 after” 这条数据了,并且事务没有提交,验证的话,还是重启一个客户端查看就好
* rollback:
回滚事务,也就是说,我们之前做的操作我都不要了,回滚到开始事务时候的状态,并结束事务。
* insert into info values(1,"no transaction",20181019):
再插入一条数据
* select * from info:
再另外一个客户端直接查询,立马看到上面插入的数据 “no transaction”,也是验证了事务确实结束了
* set autocommit=0:
上面我们插入数据,另外一个客户端立马就查询到了,说明是自动提交了我们的插入,现在我们设置不自动提交。
* insert into info values(1,"autocommit=0",20181019):
插入一条数据 “autocommit=0”
* select * from info;
在另外一个客户端查询,你会发现,上面这条 "autocommit=0" 数据并没有插入
* commit
提交,这个时候你再去查询,才能查到你提交的数据 "autocommit=0"
这里需要注意的是,不要将非自动提交和事务搞混淆了,非自动提交,一般是为了批次提交从而提升效率,但是并不具备事务性,而事务是在批次提交的基础上保证了事务性,所以还是有一定区别的噢
* 后言:
做完最后的实操,最好再对照下 事务的 ACID 四大原则琢磨琢磨,加深一下理解,关于事务的更多更深的研究,那就需要在读的你自己去慢慢耕耘咯。。。嘿嘿
!!!最后希望本文对你还是有一点帮助的!!!