事务:单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
一、数据库事务的四大特性
- 原子性:事务包含的所有操作要么全部成功,要么全部失败回滚;
- 一致性:事务的执行结果必须是使数据库从一个一致性状态变到另一个一致性状态; eg: A向B转账(共有5000),不管A和B之间如何转账,转几次账,事务结束后AB钱相加起来还得是5000;
- 隔离性:数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离;
- 持久性:事务一旦被提交,对数据库中数据的改变是永久性的,即便是在遇到故障的情况下也不会丢失提交事务的操作;
二、数据库事务的四大隔离级别
why ?多个线程都开启事务时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性。如果不考虑事务的隔离性,会发生的几种问题:脏读、不可重复读、幻读。
1、 读未提交 : 一个事务可以读取另一个未提交事务的数据
eg:用户A向用户B转账100元,对应SQL命令如下
update account set money=money+100 where name=’B’; (此时A通知B)
update account set money=money - 100 where name=’A’;
当只执行第一条SQL时,A通知B查看账户,B发现确实钱已到账(此时即发生了脏读),而之后无论第二条SQL是否执行,只要该事务不提交,则所有操作都将回滚,那么当B以后再次查看账户时就会发现钱其实并没有转这就是脏读。
2、读提交 : 一个事务要等另一个事务提交后才能读取数据。
eg:程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他买单时(程序员事务开启),收费系统事先检测到他的卡里有3.6万,就在这个时候!!程序员的妻子要把钱全部转出充当家用,并提交该事物。当收费系统准备扣款时,再检测卡里的金额,发现已经没钱了(第二次检测卡里的金额当然要等待妻子转出金额事务提交完,才能检测)。程序员就会很郁闷,明明卡里是有钱的…
分析:这就是读提交,若有事务对数据进行更新(UPDATE)操作时,读操作事务要等待这个更新操作事务提交后才能读取数据,可以解决脏读问题。但在这个事例中,出现了一个事务范围内两个相同的查询却返回了不同数据,这就是不可重复读。
3、可重复读取:在开始读取数据(事务开启)时,不再允许修改操作发生
eg:程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他买单时(事务开启,不允许其他事务的UPDATE修改操作),收费系统事先检测到他的卡里有3.6万。这个时候他的妻子不能转出金额了。接下来收费系统就可以扣款了。