事务

事务

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

posted @ 2023-04-11 22:28  星空看海  阅读(49)  评论(0编辑  收藏  举报