--MySQL事务
MySQL中事务其实是一个最小的不可分割的工作单元。事务能够保证一个业务的完整性。
比如银行转账;
a--> -100
updata user set money=money-100 where name ='a';
b--> +100
updata user set money=money+100 where name ='b';
--实际的程序中,如果只有一天语句执行成功了,而另外一条没有执行成功?
--出现数据前后不一致。
update user set money=money-100 where name ='a'; update user set money=money+100 where name ='b';
--多条sql语句中,可能有同时成功的要求,要么同时失败
--MySQL中如何控制事务?
1、MySQL默认是开启事务的(自动提交)。
mysql> select @@autocommit; +--------------+ | @@autocommit | +--------------+ | 1 | +--------------+ 1 row in set
--默认事务开启的作用是什么?
--当我们取执行一个sql语句的时候,效果会立即体现出来,且不能回滚。
create database bank; create table user( id int primary key, name varchar(20), money int ) insert into user values(1,'a',1000);
--事务回滚;撤销sql语句执行效果
rollback; mysql> select *from user; +--------+----------+-----------+ | id | name | money | +--------+----------+-----------+ | 1 | a | 1000 | | 2 | b | 2000 | +--------+----------+-----------+ 2 rows in set mysql> rollback; Query OK, 0 rows affected mysql> select *from user; +--------+----------+-----------+ | id | name | money | +--------+----------+-----------+ | 1 | a | 1000 | | 2 | b | 2000 | +--------+----------+-----------+ 2 rows in set
--设置MySQL自动提交为0;
set autocommit=0;设置关闭了MySQL的自动提交,插入数据是虚拟表,后可用 rollback; 撤销,再使用 commit; 真实提交数。
使用commit后,是不可撤销下的(持久性)
mysql> set autocommit=0; Query OK, 0 rows affected mysql> insert into user values(3,'c',3000); 1062 - Duplicate entry '3' for key 'PRIMARY' mysql> select *from user; +--------+----------+-----------+ | id | name | money | +--------+----------+-----------+ | 1 | a | 1000 | | 2 | b | 2000 | | 3 | c | 3000 | +--------+----------+-----------+ 3 rows in set mysql> rollback; Query OK, 0 rows affected mysql> select *from user; +--------+----------+-----------+ | id | name | money | +--------+----------+-----------+ | 1 | a | 1000 | | 2 | b | 2000 | +--------+----------+-----------+ 2 rows in set mysql> commit; Query OK, 0 rows affected mysql> insert into user values(3,'c',3000); Database changed mysql> commit; Query OK, 0 rows affected mysql> rollback; Query OK, 0 rows affected mysql> select *from user; +--------+----------+-----------+ | id | name | money | +--------+----------+-----------+ | 1 | a | 1000 | | 2 | b | 2000 | | 3 | c | 3000 | +--------+----------+-----------+ 3 rows in set
--自动提交?@@autocommit=1
--手动提交?commit;
--事务回滚?rollback;
如果说这个时候转账
rollback; 反悔撤回
--事务给我们提供一个返回的机会。
将autocommit设置回去
mysql> select @@autocommit=1;
+----------------+
| @@autocommit=1 |
+----------------+
| 1 |
+----------------+
1 row in set mysql>
begin;
--或者
start transaction; --都可以帮我们手动开启一个事务
--手动开启临时事务1 begin; update user set money=money-100 where name ='a'; update user set money=money+100 where name ='b'; --手动开启临时事务2 start transaction; update user set money=money-100 where name ='a'; update user set money=money+100 where name ='b';
commit;真实提交