mysql事务

事务是一个最小的不可分割的工作单元,能改保证一个业务的完整性

例 银行转账

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)

下面主要介绍一下 事务的隔离性:

未完待续。。。。。。。

学习自编程158俱乐部b站教学视频

原文地址:https://www.cnblogs.com/liu-ai-yu/p/13162602.html