事务
1、什么是事务?
事务是MySQL的一种机制,每开启一个事务,都可以往里放入一系列的SQL语句。
事务是单个逻辑工作单位执行的一系列操作,要么全执行,要么全不执行,每开一个事务,相当于给数据库拍了一张快照,这意味着在提交之前可以回滚,在事务中可以设置多个保存点,然后可以进行回滚到每个保存点
我们默认为每条sql开启事务,并且会在本条sql执行完毕后自动执行commit提交,直接用 SET 来改变 MySQL 的自动提交模式,手动开启的事务里默认不会自动提交。
结束事务可以使用commit和rollback,结束事务会释放事务中所有的锁
2、事务的作用
保证了对数据操作的数据安全性
3、事务有哪些特性?
我们可以用拿发起一笔转账作为例子来诠释事务的特性
事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
-
原子性(atomicity)
一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
比如转账行为(指转账方金额减少和接收方金额增加)只可能全执行成功或全执行失败。 -
一致性(consistency)
事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
比如张三和李四都有500元的余额,他们余额的总数是1000元,然后开启了一个转账事务,张三给李四转了100元以后,他们各自的余额发生了变化,但他们的总金额仍然保持不变。
另外,在事务发生的前后,数据类型也应该保持一致。 -
隔离性(isolation)
一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
比如转账时如果A和B同时各开一个事务给C转账,事务2的B先转账成功,但此时事务1中的A看不到B转账成功的信息,但A转账完,C能同时收到A和B的转账。 -
持久性(durability)
持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
4、如何使用事务
事务的三个关键字
先介绍事务的三个关键字 再去用表实际展示效果
事务相关关键字
start transaction:开启事务
rollback:回滚事务
commit:提交事务
savepoint:节点(用的很少)
具体示例
# 准备表
create table user(
id int primary key auto_increment,
name char(32),
balance int
);
# 插入数据
insert into user(name,balance)
values
('jason',1000),
('egon',1000),
('tank',1000);
# 修改数据之前先开启事务操作
start transaction;
# 修改操作
update user set balance=900 where name='jason'; #买支付100元
update user set balance=1010 where name='egon'; #中介拿走10元
update user set balance=1090 where name='tank'; #卖家拿到90元
# 无论是commit还是rollback,该事务都会结束。
# 回滚到上一个状态
rollback;
# 开启事务之后,只要没有执行commit操作,数据其实都没有真正刷新到硬盘
commit;
"""开启事务检测操作是否完整,不完整主动回滚到上一个状态,如果完整就应该执行commit操作"""
站在python代码的角度,应该实现的伪代码逻辑
try:
update user set balance=900 where name='jason'; #买支付100元
update user set balance=1010 where name='egon'; #中介拿走10元
update user set balance=1090 where name='tank'; #卖家拿到90元
except 异常:
rollback;
else:
commit;
5、MySQL开启事务的三种方式
1、隐式开启,隐式提交(默认)
默认情况下,你每敲一条SQL语句,都会开启一个事务。这条语句一运行完,会自动帮你commit提交,所以平时我们使用update语句修改数据库,都会自动提交。
2、显式开启,显示提交
使用代码 start transaction或者简写为begin。
这样你所写的事务就不会自动触发commit提交,你可以选择手动commit 提交或是rollback回滚。
注意点:无论是commit还是 rollback,该事务都会结束。
3、显示开启,隐式提交
设置参数
Set session autocommit =0
这样设置完,就不会自动提交
总结:MYSQL 默认为每条sql开启事务,并且会在本条sql执行完毕后自动执行commit提交,若想设置手动提交,有两种方式
方式一:直接用 SET 来改变 MySQL 的自动提交模式(下述设置均为会话级别的设置):
SET AUTOCOMMIT=0 禁止自动提交
SET AUTOCOMMIT=1 开启自动提交
方式二: 手动开启的事务里默认不会自动提交
# 手动开启的事务里默认不会自动提交,所以我们可以将要执行的sql语句放在我们自己手动开启的事务里
start transaction;
update test.t1 set id=33 where name = "jack";
commit;
注意:这种方式在当你使用commit或者rollback后,事务就结束了,再次进入事务状态需要再次start transaction