概述:
事务是实际开发中,比较常见业务逻辑操作中都会存在问题,比如转账的业务,需要将一个账户的钱转向到另一个账号,此时会涉及到两个修改操作:A账户钱减少,B账户钱增加;这两个操作要保证能同时成功或者同时失败,那么这一个业务需求(逻辑单元)就称之为一个事务。
事务特性:
1.原子性: 对于事务中的多次更新操作要么同时成功,要么同时失败
2.一致性:保证事务操作完成之后,所有的结果一致
3.隔离性:事务之间各自独立存在互相不影响
4.持久性:事务完成之后,确保所有的数据长期持久的存在
Mysql事务的使用:
ps:mysql中只有使用InnoDB引擎才能支持事务;MyISAM引擎不支持事务
参考代码:
-- 开启事务(事务一旦开,后续的所有更新操作都在这个事务中,直到提交后才会对物理表产生影响)
start transaction;
-- 设置保存点(在当前位置设置保存点,通过rollback to 保存点,可以回滚到该位置)
savepoint p1;
-- 回滚保存点(回滚到指定的保存点:一旦回滚,则当前保存点会撤销)
rollback to p1;
-- 回滚到事务开始的位置
rollback;
-- 提交事务
commit;
事务隔离级别:
由于实际的业务操作可能会涉及到很多事务的并发操作,因此在事务并发时可能会遇到一下问题:
-
丢失更新:撤消一个事务时,把其它事务已提交的更新的数据覆盖了。
-
脏读:事务A读取了事务B更新的数据,而此时事务B并未提交,那么A读取到的数据是脏数据
脏数据
-
不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新
并提交,导致事务A多次读取同一数据时,结果 不一致。 -
幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B
就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有
改过来,就好像发生了幻觉一样,这就叫幻读。
对于以上可能出现的问题,数据库中引入事务隔离级别的解决方案:
以上是解决事务并发问题的方案,其中隔离级别从低到高,对数据操作的效率影响从低到高;Mysql中默认的隔离级别是:repeatable-read