这个其实用脚趾头想想也知道它的重要性,举个简单的例子: 一个用户提交了一个订单,那么这条数据包含了两个信息,用户信息 和购买的 商品信息,我需要把他们分别存到 用户表 和 商品表,如果不采用事务,可能会出现,商品信息插入成功,而用户信息没有,这时候就会出现无主商品了,用户付了钱,却得不到商品,这就尴尬了,而如果采用事务,就可以保证,用户信息 和 商品信息 都必须插入成功,该次事务才算成功,那就不会出现这种问题了
有时候事务并不一定是必须的,为了提升查询效率,有些mysql引擎是不支持事务的,比如 MyISAM,当然目前新版(好像是5.6以后)默认的引擎是 innoDB 是支持事务的,一般为了提升mysql速度,也会做读写分离,因为事务一般是针对写来说的。
我们主要从以下几个术语开始:
start transaction
即可开始一个事务rollback
即可回退一个事务:rollback 必须是在一个事务里面才能使用,没有事务,就不能谈回退commit
使用 commit 来结束一个事务的处理:一般使用事务,我们需要自己手动提交,mysql 默认是自动提交的,所以我们需要设置set autocommit = 0
来更改提交模式。其中值得注意的是 rollback
也会触发提交事务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"这里需要注意的是,不要将非自动提交和事务搞混淆了,非自动提交,一般是为了批次提交从而提升效率,但是并不具备事务性,而事务是在批次提交的基础上保证了事务性,所以还是有一定区别的噢