事务是一个最小的不可分割的工作单元,能改保证一个业务的完整性
例 银行转账
a -> -100
update user set money= money -100 where name ='a';
b-> +100
update user set money= money +100 where name ='b';
如果两条语句,只执行成功一条,那么 就会出现数据的先后不一致问题
所以事务的出现就会要求多条语句同时成功或者同时失败。
mysql是默认开启事务的
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+ // 为1 代表自动提交 ,不能回滚
| 1 |
+--------------+
- 默认事务开启的作用:执行一天mysql语句时,效果会立即体现出,且不能回滚。
实例:创建一个数据表
mysql> create table user12(
-> id int primary key,
-> name varchar(20),
-> money int
-> );
插入数据:insert into user12 values(1,'a',1000);
查询数据:select* from user12;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 1000 |
+----+------+-------+
- 事务回滚----撤销操作效果rollback)
我们接着执行 rollback;
rollback;
再来查询,select* from user12;
+----+------+-------+
| id | name | money |
+----+------+-------+ //可以看到 不能回滚
| 1 | a | 1000 |
+----+------+-------+
所以我们要想回滚,只需要把上面的@@autocommit变为0
set @@autocommit=0;
输出:
+--------------+
| @@autocommit | //0 关闭了自动提交
+--------------+
| 0 |
+--------------+
我们再插入一条数据:insert into user12 values(2,'b',2000);
mysql> select* from user12;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 1000 |
| 2 | b | 2000 |
+----+------+-------+
尝试 回滚:rollback;
`+----+------+-------+`
`| id | name | money |`
`+----+------+-------+` //撤销刚刚的操作
`| 1 | a | 1000 |`
`+----+------+-------+`
如果想插入第二条语句之后,立即生效,在后边直接加 commit;------手动提交
如果们不想设置 autocommit的值,可以尝试使用 begin或者 start transaction,都可以帮我们手动开启一个事务
先查看一下我们的账户:select* from user12;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 1000 |
| 2 | b | 2000 |
+----+------+-------+
执行转账操作:
mysql> update user12 set money= money -100 where name ='a';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> update user12 set money= money +100 where name ='b';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select* from user12;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 900 |
| 2 | b | 2100 |
+----+------+-------+
2 rows in set (0.00 sec)
rollback;一下,没有回滚,因为autocommit的值是1
我们再次执行转账操作,但是这次在前面加一个begin
mysql> begin;
mysql> update user12 set money= money -100 where name ='a';
mysql> update user12 set money= money +100 where name ='b';
查询一下:
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 800 |
| 2 | b | 2200 |
+----+------+-------+
现在,rollback;一下,再次查询:
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 900 | //回滚成功
| 2 | b | 2100 |
+----+------+-------+
start transac 效果相同
若想提交,直接commit 一下就好
事务的四大特征
- A 原子性:最小的单位,不可分割
- C 一致性:同时成功或失败
- I 隔离性:事务1 和事务2 互不干扰
- D 持久性:事务一旦结束,不可回滚(commit,rollback)
下面主要介绍一下 事务的隔离性:
未完待续。。。。。。。