acid只的是原子性,持久性,隔离性,持久性
原子性,
概念理解 : 事务代表的最小的执行单元,事务中操作要么同时发生,要么同时不发生,不会出现有些发生有些不发生的情况,
例子 : 银行转账,A账户转账到给B账户转账100,事务中的操作分两步, A账户减100,B账户加100, 这两步必定同时成功或失败
一致性
概念理解 : 事务完成前后,事务必须从同一个一致性变到另一个一致性,
例子 : 银行转账 , 账户A和账户B 互相转账 , 转账前总额1000 转账后总额也一定是 1000 , 这个在分布式系统中比较重要 ,
另一个例子 : 初始值为a = 0 有100 个事务, 每个事务中操作为 a++ ,则全部事务结束后 值为100 , 这也是一致性的一种体现,
隔离性
概念理解 : 两个事务互不影响
例子 : 银行转账, 事务甲 账户A给账户B转账, 事务乙 账户B 给账户C 转账, 事务甲成功与否都不会影响事务乙
持久性
概念理解 : 事务完成后, 其结果将被永久的保留
例子 : 银行转账, 账户A 给账户B 转账100 转账完成后, 其结果不会改变 , 这个比较理解,
acid是对数据库的要求, 但并不是每个数据库系统都会具备这些特性, 因为有性能的要求, 有些问题是可以容忍的, 但是有些问题要坚决避免, 下面对数据库关于事务的一些问题进行说明
脏读
概念理解 : 一个事务读取到了另一个事务未提交的数据
例子 : 银行转账, 事务甲 , 账户A给账户B 转账100 ,事务乙 B 查看自己的账户, 如果 事务甲为未提交的状态, 事务乙 显示了事务甲的数据, 即 账户B 上多了100 , B 以为钱已经到账了, 此时 事务甲回退, 事务甲失败, 转账未成功, 则B 蒙受损失
注意 : 脏读是要严格避免的
不可重复读
概念理解 : 一个事务多次查询操作,得到的数据(数据内容)不一致, 则为不可重复读
例子 : 查看余额, 事务甲开启, 发现余额为100 此时事务未提交, 过了几秒, 再次查看余额, 发现余额为 200 , 两次查看余额的数值不一致, 这就是不可重复读 ,
另一个例子 : 事务甲为查看数据库中所有用户, 发现两次查询时, 得到的数据发生了变化,
幻读
概念理解 : 一个事务多次查询操作,得到的数据(条数)不一致, 则为幻读
例子 : 查看银行交易记录 , 事务两次查询, 发现第二次查询比第一次查询多了一条记录, 则为幻读 ;
更新丢失
概念理解 : 两个事务同时更新操作, 其中一个事务把另一个已经提交的事务的数据覆盖了 , 则发生了更新丢失 , 更新丢失也是要严格避免的
例子 : 银行转账 , 事务甲, 账户A 给账户B 转账100 , 事务乙, 账户C 给账户B 转账200 , 事务甲提交后, 事务乙提交, 此时 账户B 上只多了 200 , 此时发生更新丢失, 事务乙把事务甲的数据覆盖了 ,
mysql的隔离级别
有四种,
读未提交, 什么都解决不了, 最不安全, 效率最高, 禁止使用,
不可重复读, 可以解决脏读, 效率比较高,
可重复读, 可以解决不可重复读, mysql默认隔离级别, 解决方式就是行锁,
串行化, 什么都能解决, 但是效率底下, 没有并发量, 解决幻读需要表锁,或间隙锁,