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