张三(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) 读未提交数据
所有的问题都不解决 这种情况是所有隔离性中 性能最好的