MySQL事务是一组DML(select\update\delete)语句的集合,mysql数据库中InnoDB存储引擎支持开启事务,MyISAM不支持。MySQL事务默认自动提交,可通过begin、commit、rollback手动控制。
事务有四大特性,原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
事务中的操作要么全执行,要么全不执行
数据库的完整性约束没有被破坏,事务执行的前后都是合法的数据状态
eg:甲乙两个银行账户的总金额再转账前后必须一致,只允许事务执行过程中短暂出现不一致的情况
隔离性是指,事务内部的操作与其他事务是隔离的,并发执行的各个事务之间不能互相干扰
持久性是指事务一旦提交,它对数据库的改变就应该是永久性的
读到了其他事务未提交的数据
一个事务内的多次查询返回了不同的结果,这是由于在查询过程中,数据被另外一个事务修改并提交了
幻读是指在一个事务内按照相同的查询条件进行了两次查询,但第二次查询发现了第一次查询不存在的新行(即“幻影行”)
事务可以读取到其他事务尚未提交的数据变更,即脏读(Dirty Read)
事务只会读取到其他事务已经提交的数据,解决了脏读的问题,但任然会出现不可重复度和幻读的问题
一个事务多次读取的同一个数据返回的结果相同,但任然会有幻读
在此级别下,事务会按序列化的顺序执行,相当于每个事务都会获取所有受影响数据上的锁,直到事务结束。这样可以防止所有类型的并发问题,包括脏读、不可重复读以及幻读,但代价是可能会导致更高的锁定开销和更低的并发性能。
MySQL的InnoDB引擎默认隔离级别是可重复读,可以处理读脏和不可重复读问题,但是会出现幻读和更新丢失的问题
eg:
UPDATE
操作,将某行记录的值从 X
改为 Y
。UPDATE
操作,将其值从 X
改为 Z
。Z
。X
更新为 Y
的动作无法反映到最终的数据中,从而导致了事务A的更新丢失。解决方法