MySQL的事务-原子性

MySQL的事务处理具有ACID的特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。

1. 原子性指的是事务中所有操作都是原子性的,要么全部完成,要么全部不完成。这意味着事务执行过程中的任何错误都会导致事务回滚到开始前的状态,所有操作就像没有发生一样。

原子性体现如下:

假设有一张账号表,现在要进行转账操作(从zhangsan账号转1000元到lisi账号)

没有事务控制的情况下,操作应该如下

update account set money=money-1000 where name='zhangsan';

update account set money=money+1000 where name='lisi';

如果在处理的过程中出错了,那么可能就会导致数据只更新了一般,比如

update account set money=money-1000 where name='zhangsan';
出错了...

update account set money=money+1000 where name='lisi';

由于“出错了...”不是sql语句,应该执行到“出错了...”就会抛错,导致

update account set money=money+1000 where name='lisi'; 没有被执行。

因此就会发现钱丢了1000元。最终结果就会变成

造成这个结果的原因如下:

(1)mysql的事务是自动提交的, 可以使用select @@autocommit进行查看

@@autocommit=1表示事务是自动提交的;

(2)这两个sql语句分别是两个单独的事务,应该当执行完第一个语句的时候,中间出错了,那么第一个语句的结果已经被提交了,而第二个语句没有被执行到。

update account set money=money-1000 where name='zhangsan';
出错了...

update account set money=money+1000 where name='lisi';

解决上面问题的方式有两种,一是将事务改为手动提交,二是开启事务,具体的解决方式如下

(1)事务改为手动提交

set @@autocommit=0;


update account set money=money-1000 where name='zhangsan';
出错了...

update account set money=money+1000 where name='lisi';

当sql出错时,进行rollback回滚,就不会提交事务了。

(2)开启事务

start transaction;


update account set money=money-1000 where name='zhangsan';
出错了...

update account set money=money+1000 where name='lisi';

当sql出错时,不提交事务,进行rollback回滚,同样可以保证事务的原子性。

以上就是事务的原子性,后续文章将进行一致性、隔离性、持久性的学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摩羯座程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值