2021-03-02

事务
mysql数据库事务:(database transaction): 事务是由一组SQL语句组成的逻辑处理单元,这些操作要么全做要么全不做,是一个不可分割的工作单位。
事务四大特性
原子性(Autmic):事务必须是原子工作单元,不能被分隔的,事务中的操作要么全部执行,要么全都不执行,不能只完成部分操作。
一致性(Consistency):事务开始之前,数据库处于一致性的状态;事务结束后,数据库必须仍处于一致性状态。数据库一致性的定义是由用户负责的。例如,在银行转账中,用户可以定义转账前后两个账户金额之和保持不变。
隔离性(Isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰,这些通过锁来实现。
持久性(Durability):指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
事务的 ACID 原则保证了一个事务或者成功提交,或者失败回滚,二者必居其一。因此,它对事务的修改具有可恢复性。即当事务失败时,它对数据的修改都会恢复到该事务执行前的状态。
MySQL事务处理的方法:
用BEGIN或START TRANSACTION,ROLLBACK,COMMIT来实现事务
START TRANSACTION | BEGIN
#开启事务
COMMIT
#提交当前事务,执行永久操作。
ROLLBACK
#回滚当前事务到开始点,取消上一次开始点后的所有操作。
MYSQL默认是自动提交的,也就是你提交一个SQL QUERY,它就直接执行!
SET AUTOCOMMIT = {0 | 1} 设置事务是否自动提交,默认是自动提交的。
0:禁止自动提交
1:开启自动提交。

例:
set autocommit=0;
delimiter //
start transaction;
-> update books set bName=“ccc” where bId=1;
-> update books set bName=“ddd” where bId=2;
-> commit; //
delimiter ;
测试,查看是否完成修改:
select bName from books where bId=1 or bId=2;
我们测试回滚操作,首先看我们的数据库存储引擎是否为innodb
show create table books;
为MyISAM无法成功启动事务,虽然提交了,却无法回滚
修改数据库存储引擎为innodb
mysql> alter table books engine=innodb;
mysql> alter table category engine=innodb;
mysql> show create table books;

重新开启事务,并测试回滚
delimiter //
start transaction;
-> update books set bName=“HA” where bId=1;
-> update books set bName=“LB” where bId=2;
-> commit //
delimiter ;
select bName from books where bId=1 or bId=2;
rollback; #回滚
查看结果:select bName from books where bId=1 or bId=2;
回滚失败,因为我们commit已经提交了,并且执行成功了
这次开启事务,不提交
delimiter //
start transaction;
update books set bName=“AH” where bId=1;
update books set bName=“BL” where bId=2;
// #开启事务,不提交
delimiter ;
查看:select bName from books where bId=1 or bId=2;
回滚:rollback;
select bName from books where bId=1 or bId=2;
回滚成功
可以看到,执行rollback回滚命令后,rollback使数据表回滚到了事物开始前的状态。很多时候一个事物会包含多条语句,而出现问题需要回滚时,并不一定是要回滚到begin之前的状态,有可能是某条语句执行后的状态,这时要使用savepoint定义回滚点,rollback决定回滚到的位置。
例:以stu表为例:
create table stu(sid int(11) not null primary key,name varchar(50) not null);
关闭mysql的自动提交功能:
set autocommit=0;
begin;
insert into stu values(1,‘berry’);
savepoint s1;
insert into stu values(2,‘linda’);
savepoint s2;
执行回滚前,查询stu表中数据:
select * from stu;
执行rollback回滚到s1回滚点
rollback to savepoint s1;
select * from stu; 回滚成功

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值