天天看点

mysql之事务 | 事务的四大特性

事务 📖

事务四大特性(ACID):
    A: 原子性
        每个事务都是不可分割的最小单位(同一个事物内的多个操作要么同时成功要么同时失败)
    C: 一致性
        执行完事务之后数据库的数据状态(从一个状态变为另一个状态)
    I: 隔离性
        事务与事务之间彼此不干扰
    D: 持久性
        一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。

           

实际案例比喻什么是事务:

我们来看一个现象:
准备三个身份:
小明
ATM机
小强

小明用建行的卡通过农行的ATM机给工行小强转1000元,
那么建行就会给小明的卡减1000元
共行就会给小强的卡增加1000元。(其实你的钱就是一个sql语句)
那么这时候会不会产生这样一个现象:在转钱的过程中工行的系统出现了问题,小明的卡明明已经减了1000元,但是小强的卡因工行系统问题并没有增加那1000元。
这种情况在之前是常有发生的。

那么这个时候怎么解决这个问题呢?
这里发明了事务:同时改变状态,要么同时成功要么同时失败。(我不增加钱对方就不会减钱,对方减了钱数那我肯定增加钱)
           

补充:

# 开启事务:(下面的所有操作都包含在一个事务里边:下面的操作要么同时成功要么同时失败 可以回退)
start transaction;

# 如何回滚:
rollback;

# 如何确认:
commit;

           

实例:

# 模拟消费

create table user(
    id int primary key auto_increment,
    name char(32),
    balance int	   # 存款
);

insert into user(name,balance) values ('gary',1000),('jack',1000),('tom',1000);

start transaction;   # 开启事务

# 修改操作
update user set balance=900 where name='gary';  # 支付100元
update user set balance=1010 where name='jack';  # 中介拿走10元
update user set balance=1090 where name='tom';  # 收款方收到90
           
mysql之事务 | 事务的四大特性
但是在事务里边这个数据还没有到硬盘中,还没有保存。
现在这个状态还可以回退(我反悔了我不买了)
回滚操作:rollback;
           
mysql之事务 | 事务的四大特性
确认数据:确认支付成功不反悔了
commit;
           
mysql之事务 | 事务的四大特性

结论:在事务下面的操作 要么同时成功要么同时失败可以回退,事务在提交后是在内存中,没有刷新到硬盘必须执行commit;确认才会刷新到硬盘 整个事务结束。

使用python代码来完善事务实现伪代码逻辑:
try:  # 判断异常
        update user set balance=900 where name='gary';  # 支付100元
	update user set balance=1010 where name='jack';  # 中介拿走10元
	update user set balance=1090 where name='tom';  # 收款方收到90
except 异常:  # 如果有异常就回滚
    rollback;
else:   # 无异常则保存解释事务
    commit;
           

继续阅读