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回滚,同样可以保证事务的原子性。
以上就是事务的原子性,后续文章将进行一致性、隔离性、持久性的学习。