原文件下载路径:
【Python数据库操作】Python操作MySQL实战:事务、锁、连接池及SQL工具类开发详解
day29 Python操作MySQL和实战
课程目标:掌握事务和锁以及Python操作MySQL的各种开发必备知识。
课程概要:
- 事务
- 锁
- 数据库连接池
- SQL工具类
- 其他
1. 事务
innodb引擎中支持事务,myisam不支持。
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` varchar(32) DEFAULT NULL,
`amount` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
例如:zzc 给 刘亦菲 转账 100,那就会涉及2个步骤。
- zzc账户 减100
- 刘亦菲账户 加 100
这两个步骤必须同时完成才算完成,并且如果第一个完成、第二步失败,还是回滚到初始状态。
事务,就是来解决这种情况的。 大白话:要成功都成功;要失败都失败。
事务的具有四大特性(ACID):
-
原子性(Atomicity)
原子性是指事务包含的所有操作不可分割,要么全部成功,要么全部失败回滚。
-
一致性(Consistency)
执行的前后数据的完整性保持一致。
-
隔离性(Isolation)
一个事务执行的过程中,不应该受到其他事务的干扰。
-
持久性(Durability)
事务一旦结束,数据就持久到数据库
1.1 MySQL客户端
mysql> select * from users;
+----+---------+---------+
| id | name | amount |
+----+---------+---------+
| 1 | liuyifei | 5 |
| 2 | zzc | 6 |
+----+---------+---------+
3 rows in set (0.00 sec)
mysql> begin; -- 开启事务 start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> update users set amount=amount-2 where id=1; -- 执行操作
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> update users set amount=amount+2 where id=2; -- 执行操作
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> commit; -- 提交事务 rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from users;
+----+---------+---------+
| id | name | amount |
+----+---------+---------+
| 1 | liuyifei | 3 |
| 2 | zzc | 8 |
+----+---------+---------+
3 rows in set (0.00 sec)
mysql> select * from users;
+----+---------+---------+
| id | name | amount |
+----+---------+---------+
| 1 | liuyifei | 3 |
| 2 | zzc | 8 |
+----+---------+---------+
3 rows in set (0.00 sec)
mysql> begin; -- 开启事务
Query OK, 0 rows affected (0.00 sec)
mysql> update users set amount=amount-2 where id=1; -- 执行操作(此时数据库中的值已修改)
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: