1.事务提方式
mysql中有两种事务提交方式:
手动提交
自动提交
1.1事务手动提交过程
事务执行成功过程:开启事务->执行多条件SQL语句->成功->事务提交
事务执行失败过程:开启事务->执行多条件SQL语句->失败->事务回滚
1.2语法格式
格式:
starttransaction;#开启事务
commit;#提交事务
rollback;#回滚事务
1.3案例
事务成功提交:模拟张三给李四转500元钱(成功)目前
数据库数据如下:
+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 500 |
| 2 | 李四 | 1500 |
+----+--------+-------+
#开启事务
mysql> start transaction;
Query OK, 0 rows affected (0.01 秒)
#执⾏从张三帐户扣出500元
mysql> update yh set money=money-500 where
name='张三';
Query OK, 1 rows affected (0.01 秒)
#执⾏往李四帐户加⼊500元
mysql> update yh set money=money+500 where
name='李四';
Query OK, 1 rows affected (0.01 秒)
#提交事务
mysql> commit;
Query OK, 0 rows affected (0.08 秒)
#查看帐户
mysql> select * from yh;
+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 0 |
| 2 | 李四 | 2000 |
+----+--------+-------+
2 ⾏于数据集 (0.01 秒)
事务回滚:模拟李四给张三转500元钱(失败)目前数据库
数据如下:
+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 0 |
| 2 | 李四 | 2000 |
+----+--------+-------+
#开启事务
mysql> start transaction;
Query OK, 0 rows affected (0.02 秒)
#执⾏从李四帐户扣出500元
mysql> update yh set money=money-500 where
name='李四';
Query OK, 1 rows affected (0.01 秒)
#执⾏往张三帐户加⼊500元,但是加了600
mysql> update yh set money=money+600 where
name='张三';
Query OK, 1 rows affected (0.01 秒)
#事务回滚
mysql> rollback;
Query OK, 0 rows affected (0.02 秒)
#查看帐户
mysql> select * from yh;
+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 0 |
| 2 | 李四 | 2000 |
+----+--------+-------+
2 ⾏于数据集 (0.01 秒)
2.1事务自动提交
MySQL默认每一条DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,语句执行完毕自动提交事务,MySQL默认开始自动提交事务。
如:事务开始->update/delete/insert into->事务提交
2.2自动提交事务案例
自动事务提交:往张三的账户里存入1000元,目前数据库数据如下:
+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 0 |
| 2 | 李四 | 2000 |
+----+--------+-------+
mysql> update yh set money=money+1000 where
name='张三';
Query OK, 1 rows affected (0.05 秒)
mysql> select * from yh;
+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 1000 |
| 2 | 李四 | 2000 |
+----+--------+-------+
2 ⾏于数据集 (0.01 秒)
2.3取消自动提交
查看MySQL是否开启自动提交事务
格式:
select@@autocommit;
注意:
@@表示全局变量,1表示开启,0表示关闭
取消自动提交事务
格式:
set autocommit=0;
2.3.1案例
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 1 |
+--------------+
1 ⾏于数据集 (0.01 秒)
mysql> set autocommit=0;
Query OK, 0 rows affected (0.01 秒)
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 0 |
+--------------+
1 ⾏于数据集 (0.01 秒)
从李四的账户取出1000元,目前数据库数据如下:
+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 1000 |
| 2 | 李四 | 2000 |
+----+--------+-------+
注意:
要在窗口A、窗口B中验证
#窗⼝A
mysql> update yh set money=money-1000 where
name='李四';
Query OK, 1 rows affected (0.01 秒)
mysql> select * from yh;
+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 1000 |
| 2 | 李四 | 1000 |
+----+--------+-------+
2 ⾏于数据集 (0.01 秒)
#在窗⼝B中查询银⾏帐户(第⼀次验证)
#提交
mysql> commit;
Query OK, 0 rows affected (0.10 秒)
#在窗⼝B中查询银⾏帐户(第⼆次验证)
在打开一个窗口
#窗⼝B
mysql> select * from yh;
+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 1000 |
| 2 | 李四 | 2000 |
+----+--------+-------+
2 ⾏于数据集 (0.01 秒)
mysql> select * from yh;
+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 1000 |
| 2 | 李四 | 1000 |
+----+--------+-------+
2 ⾏于数据集 (0.02 秒)