事务特性
事务的特性:acid。
原子性(重要)
事务内的一组操作为原子操作,要么全部成功,要么全部失败。在实际业务如转账,就必须保证一方数目多了一方少了,数目平衡。
一致性(面试常问)
事务成功或失败的结果必须符合业务逻辑。还是以转账为例,A转给B100块,成功就A少100,B多100,失败就双方金额该多少就多少。
不能允许出现,成功了B居然没增加,失败了A少了100
隔离性(面试常问)
其实网上对隔离性的定义是这样的:一个事务的执行不能被其他事务所干扰。
这样的定义不够细致和准确,先说举个违反隔离性的例子吧:
B的最终结果应该为100,但为50,是因为违反了隔离性。
我来定义一下隔离性:多个事务差不多同时执行,且共同读写包含同一数据源时,最终多个事务的结果必须符合业务,即符合一致性
但实际中为了性能的考虑,是做不到完全的隔离性的
首先大家要明白,根据违反隔离性的程度,可以分为3个:
- 脏读。A事务正在执行还未提交,B事务读到了A事务中的数据且做了相关操作,但是A回滚了
- 不可重复读。A事务正在执行了查询sqlA的结果为abc,此时B事务更改数据源abc为def,然后A事务再次执行sqlA得到是def,此情况称为不可重复度。有人问,这不正常嘛,其实真正的隔离性应该做到不管多少次sqlA都应该是abc。说白了还是因为读取了未提交的事务导致
- 幻读。和不可重复读是一个道理,不一样是不可重复读关注值的修改,幻读是行记录变更。A事务对user表正在执行了查询sqlA的结果有1条记录,此时B事务在user表添加了2条记录,然后A事务再次执行sqlA得到3条记录,此情况称为幻读,还是因为读取了未提交的事务导致
为了解决上述的问题,提出了4个隔离级别:
- 读未提交:一个都解决不了(不采取)
- 读已提交:解决脏读
- 可重复读:解决脏读、不可重复读
- 串行化:全部解决(一般也不采取,并发性太低)
在实际生产中,2和3采取的比较多,因为做不到完全的隔离性会损坏性能
持久性(不太重要)
事务提交或回滚的结果是永久性,即保存在硬盘上的。
标签:事务,隔离,重复,提交,Mysql,sqlA,100 From: https://www.cnblogs.com/ibcdwx/p/17457800.html