mysql学习笔记(8)

打印 上一主题 下一主题

主题 778|帖子 778|积分 2334

一.事件

0.引入

        在mysql中,事件是一个最小的不可分割的单元,事件能保障一个业务的完整性。
例如银行转账:
a ----> -100
  1. update user set money = money = money - 100 where name = 'a';
复制代码
b ----> +100
  1. update user set money = money = money + 100 where name = 'b';
复制代码
实际程序中,如果只有一条程序执行成功,而另一条没有成功,出现数据不一致。
  1. update user set money = money = money - 100 where name = 'a';
  2. update user set money = money = money + 100 where name = 'b';
复制代码
多条sql程序,有同事执行成功的需求。要么就同时失败。
mysql中怎样控制事件?
1.mysql是默认开启事件的(自动提交)。

  1. select @@autocommit;
复制代码
  1. +--------------+
  2. | @@autocommit |
  3. +--------------+
  4. |            1 |
  5. +--------------+
复制代码
默认事件开启的作用是什么?
当我们去执行一个提及来语句时,效果会立刻体现出来,且不能回滚。
  1. create database bank;
  2. use bank;
  3. create table user(
  4.     id int primary key,
  5.     name varchar(20),
  6.     money int
  7. );
复制代码
  1. insert into user value(1,'张三',2000);
复制代码
  1. mysql> select * FROM user;
  2. +----+------+-------+
  3. | id | name | money |
  4. +----+------+-------+
  5. |  1 | 张三 |  2000 |
  6. +----+------+-------+
复制代码
回滚(rollback):撤销sql语句执行效果;
  1. rollback;
  2. mysql> select * from user;
  3. +----+------+-------+
  4. | id | name | money |
  5. +----+------+-------+
  6. |  1 | 张三 |  2000 |
  7. +----+------+-------+
  8. 1 row in set (0.00 sec)
复制代码
那么该怎样撤销呢?
设置mysql自动提交为FALSE:
  1. set autocommit = 0;
  2. mysql> set autocommit = 0;
  3. Query OK, 0 rows affected (0.00 sec)
  4. select @@autocommit;
  5. +--------------+
  6. | @@autocommit |
  7. +--------------+
  8. |            0 |
  9. +--------------+
  10. 1 row in set (0.00 sec)
复制代码
上面的操作关闭了mysql的自动提交(commit);
测试一下:
  1. mysql> insert into user value(2,'李四',6000);
  2. Query OK, 1 row affected (0.00 sec)
  3. mysql> select * from user;
  4. +----+------+-------+  ##这是虚拟的表,真是的表没有提交
  5. | id | name | money |
  6. +----+------+-------+
  7. |  1 | 张三 |  2000 |
  8. |  2 | 李四 |  6000 |
  9. +----+------+-------+
  10. 2 rows in set (0.00 sec)
  11. mysql> rollback;
  12. Query OK, 0 rows affected (0.01 sec)
  13. mysql> select * from user;
  14. +----+------+-------+##真是的表还未提交。
  15. | id | name | money |
  16. +----+------+-------+
  17. |  1 | 张三 |  2000 |
  18. +----+------+-------+
  19. 1 row in set (0.00 sec)
复制代码
 怎样让他真是的插入数据呢?
  1. ##再一次插入数据
  2. mysql> insert into user value(2,'李四',6000);
  3. Query OK, 1 row affected (0.00 sec)
  4. ##手动插入数据
  5. mysql> commit;
  6. Query OK, 0 rows affected (0.00 sec)
  7. ##无法撤销
  8. mysql> rollback;
  9. Query OK, 0 rows affected (0.00 sec)
  10. mysql> select * from user;
  11. +----+------+-------+
  12. | id | name | money |
  13. +----+------+-------+
  14. |  1 | 张三 |  2000 |
  15. |  2 | 李四 |  6000 |
  16. +----+------+-------+
  17. 2 rows in set (0.00 sec)
复制代码
小结

        自动提交;@@autocommmit = 1
        手动提交;commit;
        事件回滚;rollback;
如果说这时候转账,
  1. update user set money = money - 100 where name = '张三';
  2. update user set money = money + 100 where name = '李四';
复制代码
  1. mysql> select * from user;
  2. +----+------+-------+
  3. | id | name | money |
  4. +----+------+-------+
  5. |  1 | 张三 |  1900 |
  6. |  2 | 李四 |  6100 |
  7. +----+------+-------+
  8. 2 rows in set (0.00 sec)
  9. mysql> rollback;
  10. Query OK, 0 rows affected (0.01 sec)
  11. mysql> select * from user;
  12. +----+------+-------+
  13. | id | name | money |
  14. +----+------+-------+
  15. |  1 | 张三 |  2000 |
  16. |  2 | 李四 |  6000 |
  17. +----+------+-------+
  18. 2 rows in set (0.00 sec)
复制代码
2.手动开启事件

  1. set autocommit = 1;mysql> select @@autocommit;+--------------+
  2. | @@autocommit |
  3. +--------------+
  4. |            1 |
  5. +--------------+1 row in set (0.00 sec)
复制代码
除了上述方法之外,begin; 或者 start transaction;都可以手动开启一个事件。
  1. mysql> select *from user;
  2. +----+------+-------+
  3. | id | name | money |
  4. +----+------+-------+
  5. |  1 | 张三 |  2000 |
  6. |  2 | 李四 |  6000 |
  7. +----+------+-------+
  8. mysql> update user set money = money - 100 where name = '张三';
  9. Query OK, 1 row affected (0.01 sec)
  10. Rows matched: 1  Changed: 1  Warnings: 0
  11. mysql> update user set money = money + 100 where name = '李四';
  12. Query OK, 1 row affected (0.00 sec)
  13. Rows matched: 1  Changed: 1  Warnings: 0
  14. mysql> select * from user;
  15. +----+------+-------+
  16. | id | name | money |
  17. +----+------+-------+
  18. |  1 | 张三 |  1900 |
  19. |  2 | 李四 |  6100 |
  20. +----+------+-------+
  21. 2 rows in set (0.00 sec)
  22. mysql> rollback;
  23. Query OK, 0 rows affected (0.00 sec)
  24. mysql>  select * from user;
  25. +----+------+-------+## rollback是没有效果的
  26. | id | name | money |
  27. +----+------+-------+
  28. |  1 | 张三 |  1900 |
  29. |  2 | 李四 |  6100 |
  30. +----+------+-------+
  31. 2 rows in set (0.00 sec)
复制代码
 手动开启事件(1)

  1. mysql> begin ;
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> update user set money = money - 100 where name = '张三';
  4. Query OK, 1 row affected (0.00 sec)
  5. Rows matched: 1  Changed: 1  Warnings: 0
  6. mysql> update user set money = money + 100 where name = '李四';
  7. Query OK, 1 row affected (0.00 sec)
  8. Rows matched: 1  Changed: 1  Warnings: 0
  9. mysql> select * from user;
  10. +----+------+-------+
  11. | id | name | money |
  12. +----+------+-------+
  13. |  1 | 张三 |  1800 |
  14. |  2 | 李四 |  6200 |
  15. +----+------+-------+
  16. 2 rows in set (0.00 sec)
  17. mysql> rollback;
  18. Query OK, 0 rows affected (0.01 sec)
  19. mysql> select * from user;
  20. +----+------+-------+##成功回滚了
  21. | id | name | money |
  22. +----+------+-------+
  23. |  1 | 张三 |  1900 |
  24. |  2 | 李四 |  6100 |
  25. +----+------+-------+
  26. 2 rows in set (0.00 sec)
复制代码
手动开启事件(2)

  1. mysql> start transaction;
  2. mysql> select * from user;
  3. +----+------+-------+
  4. | id | name | money |
  5. +----+------+-------+
  6. |  1 | 张三 |  1900 |
  7. |  2 | 李四 |  6100 |
  8. +----+------+-------+
  9. 2 rows in set (0.00 sec)
  10. mysql> update user set money = money - 100 where name = '张三';
  11. Query OK, 1 row affected (0.00 sec)
  12. Rows matched: 1  Changed: 1  Warnings: 0
  13. mysql> update user set money = money + 100 where name = '李四';
  14. Query OK, 1 row affected (0.00 sec)
  15. Rows matched: 1  Changed: 1  Warnings: 0
  16. mysql> select * from user;
  17. +----+------+-------+
  18. | id | name | money |
  19. +----+------+-------+
  20. |  1 | 张三 |  1800 |
  21. |  2 | 李四 |  6200 |
  22. +----+------+-------+
  23. 2 rows in set (0.00 sec)
  24. mysql> rollback;
  25. Query OK, 0 rows affected (0.01 sec)
  26. mysql> select * from user;
  27. +----+------+-------+
  28. | id | name | money |
  29. +----+------+-------+
  30. |  1 | 张三 |  1900 |
  31. |  2 | 李四 |  6100 |
  32. +----+------+-------+
  33. 2 rows in set (0.00 sec)
复制代码
事件开启之后,一旦commit调,就不能回滚。
  1. mysql> commit;
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql>  select * from user;
  4. +----+------+-------+
  5. | id | name | money |
  6. +----+------+-------+
  7. |  1 | 张三 |  1900 |
  8. |  2 | 李四 |  6100 |
  9. +----+------+-------+
  10. 2 rows in set (0.00 sec)
  11. mysql> rollback;
  12. Query OK, 0 rows affected (0.00 sec)
  13. mysql> select * from user;
  14. +----+------+-------+
  15. | id | name | money |
  16. +----+------+-------+
  17. |  1 | 张三 |  1900 |
  18. |  2 | 李四 |  6100 |
  19. +----+------+-------+
  20. 2 rows in set (0.00 sec)
复制代码
3.事物的特征

A.原子性:事件是最小的单元,不可分割;
C.一致性:事件要求,同一事物中的sql语句,必须保证同时成功或同时失败;
I . 隔离性:事件a和事件b之间是有隔离性的;
D.持久性:事件一旦竣事(commit; rollback),就不可能返回。
4.事物的开启

        ①事件默认提交: set autocommit = 0;
        ②begin;
        ③start transection;
5.事件手动提交

        commit;
6.事件手动回滚

        rollback;
7.事物的隔离性




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

雁过留声

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表