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