MySQL事务问题
事务基本要素:
A:Atomicity原子性,事务的操作是原子的,事务开始后所有的操作要么都完成,要么都失败,不可能停滞在中间环节,事务执行过程中出错,那么所有操作都会回滚到最初状态,就像没修改过一样。
C:Consitency一致性,事务操作前后总量不变,不会破坏数据库的完整性约束,例如A向B转账,A的钱减少了100,此时B的钱增加了100,两人的钱加起来整体不变。
I :Isolation隔离性,事务间的操作是不会相互干扰的,同一时间只允许同一事物请求同一数据,在该事务对数据操作期间,其他事务无法操作数据。
D:Durability持久性,事务成功操作结束后,数据持久化到硬盘中不能回滚。
事务并发问题:
脏读:事务A更新了一条数据被事务B读取了,此时事务A回滚了数据,事务B就读取了脏数据
不可重复读:事务A多次读取同一条数据,在读取过程中被事务B进行了更新,导致事务A多次读取数据的结果不一致。
幻读:事务A将表中的所有数据进行了修改,例如将学生成绩全部由分数制修改为了等级制,此时事务B向表中插入了一条分数制的数据,当事务A修改完后发现还有一条数据没修改过来,就像产生了幻觉,这就是幻读。
注意:不可重复读和幻读容易混乱,不可重复读侧重于修改,对一条数据进行操作;幻读侧重添加或删除对多条数据进行操作;解决不可重复读只需要锁住一条数据,解决幻读则需要锁住整张表。
事务隔离级别
读未提交(read-uncommitted):三种并发问题均无法解决
读已提交(read-committed):解决了脏读问题
可重复读(repeatable-read):解决了脏读和不可重复读问题
串行化(serializable):三种并发问题均解决
事务隔离级别要看数据库引擎的支持,MySQL支持四种隔离级别,默认是repeatable-read;Oracle支持两种隔离级别read-committed,serializable,默认read-committed
注意MySQL中使用了MVCC多版本控制,所有在repeatable-read级别也可以避免幻读。