事务
飞飞(1000)和麻子(1000)要转钱
飞飞向李四转钱100
飞飞的钱数-100 900
麻子的钱+100 1100
再转钱的过程中飞飞的钱减少 恰巧这个时候停电,程序出现了异常,导致飞飞的钱减少,但是麻子没有增多,这样的问题 就是事务安全问题
一致性:飞飞和麻子的钱数总数保持不变
原子性:飞飞的钱减少和李四的钱增多 要用时进行
持久性: 最终这些数据的改变要保存在数据库中
事务线程
1. 脏读数据
飞飞从麻子 买东西
事务一:飞飞给麻子转账 转账成功
事务二:麻子查看账户,钱多了 他就发货了,提交了事务
事务一:回滚
2. 不可重复读
酒店前台 2个前台 A和B
来了一个客人 这个客人想住1101 号房间 前台A
来了另一个客人 这个客人找的是 前台B B把1101号房间给了这个客人
3. 幻读(虚读)
对一个订单表查询两次,另外一个事物已经添加了新的记录 之前查的是100条,现在发现是101次
为了解决上述问题:提出一个隔离性:
1.
想要完全解决上述问题,一个方法串行化(死锁),但是这种东西不推荐使用。使用效率太低
2. 可重复读(MySQL数据库默认的隔离级别)
可以防止脏读和不可重复读,不能防止幻读
3. 读已提交数据(oracle默认的隔离级别)
可以防止脏读数据,不可以防止不可重复读和幻读
4. 读未提交数据
所有问题都不解决 这种情况是所有隔离性中 性能最好的