注意哦,重点来了。
首先说一说什么是事务吧,我理解的事务就是多条语句一起执行的话要么一次执行成功,要么失败,只有这两种情况,不能出现,这条语句执行成功,另一条语句执行失败的情况。就是把多条语句看成是一条语句。
官方的解释是:把多条语句作为一个整体进行操作的功能,被称为数据库事务。数据库的事务可以保证该事务范围内所有的操作都可以全部成功或者全部失败,如果事务失败,那么效果就跟没有执行这些sql一样,不会对数据库数据有任何的改动。
那么这么做有什么好处呢?
有以下四大好处:
1.原子性:将所有的sql作为原子工作单元执行,要么全部执行,要么全部不执行。
2.一致性:事务完成之后,所有数据的状态都是一致的。
3.隔离性:如果有多个事务并发执行的话,每个事务做出的修改必须与其他事务隔离。
4.持久性:即事务完成后,对数据库数据的修改被持久化存储。
这些特性也就是我们常说的ACID四大特性。
对于单条sql语句,数据库系统自动的将其作为一个事务执行,这种事务通常被称为隐式事务。
有了隐式事务那么自然就存在显式事务。
想要把多条语句作为一个事务去执行,必然需要我们自己去手动的开启一个事务,手动的去提交一个事务。这种事务我们就称为显式事务。
开启事务: begin
提交事务:commit
回滚事务:rollback
-- 一个事务的完整流程 --
begin;
update `accounts` set balance = balance - 100 where id = 1;
update `accounts` set balance = balance + 100 where id = 2;
commit;
begin;
update `accounts` set balance = balance - 100 where id = 1;
update `accounts` set balance = balance + 100 where id = 2;
rollback;
隔离级别
对于两个并发执行的事务来说,如果同时操作同一条数据的话,可能会发生问题,比如脏读,不可重复读,幻读。因为并发操作会导致数据的一致性遭到破坏。所以数据库系统为我们提供隔离级别让我们有针对性的选择事务的隔离级别,避免数据的不一致性问题。
脏读:两个并发的事务,同时操作一条记录,一个事务会读取到另一个事务已经修改但是没有提交的数据,如果另一个数据发生了回滚操作,那么当前事务读到的数据就是我们常说的脏数据。
不可重复读:在一个事务内,多次读取同一条记录的时候,第一次读取到的数据和第二次读取到的数据不一样。
幻读:在一个事务中,第一次查询某条记录,发现没有,但是当试图对这不存在条记录执行更新操作的时候,竟然能够成功,并且对这条数据再次进行读取的时候,它竟然神奇的出现了。
如果未指定隔离级别,数据库会使用默认的隔离级别,在mysql中,如果使用InnoDB,默认的隔离级别可重复读。