mysql中,事务其实是一个最小不可分割的工作单元,事务能够保证一个业务的完整性。
- 比如银行转账
a --> -100
b --> +100
update user set money=money-100 where name='a';
update user set money=money+100 where name='b';
在实际开发中,如果只有一条语句执行成功了,而另外一条没有执行成功,就会导致数据前后不一致。
- 多条sql语句,可能会有同时成功的要求,要么就同时失败。
- mysql中如何控制事务:
- mysql默认是开启事务的(自动提交)
- 默认事务开启的作用是:当我们去执行一个sql语句的时候,效果会立即体现出来,且不能回滚。
举例:
create table user(
id int primary key,
name varchar(20),
money float
);
插入一条数据:
INSERT INTO USER VALUES(1,'a',1000);
尝试进行事务回滚(即撤销sql语句执行)
rollback;
之后再进行查询,结果为:
- 如果我们希望实现回滚,则需要设置mysql自动提交为false
set autocommit=0;
以上操作关闭了mysql的自动提交(autocommit)
这时候我们再去插入一条数据
INSERT INTO USER VALUES(2,'b',1000);
再次尝试回滚:
rollback;
rollback之后第二条数据就没了(之前包含两条数据的表是一张未提交的临时表),如果想要其成功提交,需要使用commit
进行操作(手动提交数据)。
commit(手动提交数据)
之后rollback(撤销)
就没有效果了,这里体现出持久性。
总结:
- 自动提交 @@autocommit=1
- 手动提交 @@autocommit=0 commit
- 事务回滚 rollback
回到刚开始转账的问题:事务给我们提供了一个反悔的机会,如果发现问题,在关闭自动提交的情形下使用rollback
回滚;如果没得问题,就commit
手动提交。