事务4个特性
1,原子性
当前事务中所有sql,要么全部执行成功,要么全部不执行。
2,一致性
事务执行前后,不能破坏逻辑有一致性。
比如:A转账给B,A转出了,B转入时异常了。这样必须全部回滚,不然不符合一致性。也不符合原子性。这个操作应该是一个原子性的。
3,隔离性
隔离性涉及到事务的4个隔离级别。后面会说到。
4,持久性
事务一旦提交就不能被回滚。
事务隔离级别
1,读未提交read uncommited
事务A能读取到其他事务中修改的未提交的数据。如果这时其他事务回滚了,容易造成脏读。
eg:A要读取余额100,B这时做了一个扣款20,A读取到的就是80,但是后面B回滚了,余额还是100.这时A中读取到的80就是脏数据。
2,读提交read commited
事务A能读取到其他事务修改的并提交的事务,但是会造成当前事务多次读取一个数据时数据不一致。造成不可重复读。
eg:A第一次读取余额100,这期间B做了扣款20,余额80,A再次读取同一条记录,数据变成80,造成不可重复读取。
3,可重复读 RR
在rc基础上通过行锁解决了不可重复读问题,但又出现了幻读(这个名字一直不太能接受),当前事务读取了数据行,另一个事务添加了新的数据,当前事务更新数据后,发现还有未更新的新出现的行,跟幻觉一样。叫幻读。
mysql的RR通过mvcc多版本并发控制解决了这个问题,所以mysql的默认RR级别可以说是实现了串行化,但性能又高于串行化的一个事务隔离级别。
4串行化
强制事务排序,在资源上加上共享锁,隔离性最好,性能最差,解决了幻读问题。