数据库事务的特性和隔离级别(简单,易懂,易记)
数据库事务的四大特性(ACID)
原子性(Atomicity)
事务中的操作要么全部成功,要么失败回滚
一致性(Consistency)
一个事务执行之前和执行之后都必须处于一致性状态。拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。
隔离性(Isolation)
两个事务之间操作互不影响. 不采用数据隔离会出现脏读,不可重复读和幻读. 数据库的隔离级别有读未提交,读提交,可重复读和串行化
持久性(Durability)
一个事务一旦提交了,那么数据库中数据的改变就应该是永久性的.即便是数据库系统遇到故障的情况下也不应该改变数据
数据库的隔离级别
mysql支持这四种隔离级别,但是默认支持到可重复读
读未提交
一个事务可以读取另一个事务已经修改但是还未提交的数据.会导致脏读.使用读提交可以解决脏读
读提交
一个事务要等另一个事务提交后才能读取事务.会导致不可重复读.采用可重复读可以解决不可重复读
例如:我拿卡去消费,系统显示卡内余额剩余1万,就在这个时候,老婆把钱转到自己的账户了,这个时候,我这边收费系统准备扣款时,卡里竟然没钱了.在这个事例中,出现了一个事务范围内的两次查询却返回了不同的数据.这就是不可重复读
可重复读
开始读取数据(事务开启)的时候,不允许修改(update)操作,但是仍然会导致幻读
有一天,妻子查看我的消费记录(事务开启),发现我消费了1万元,就在这个时候,我又买了一万元的电脑,即进行了insert操作,并提交了事务.当妻子打印我的消费记录时(妻子事务提交).发现我花了2万元,仿佛出现了幻觉.这就是幻读.采用序列化可以避免幻读
Serializable串行化(序列化)
Serializable是最高的事务隔离级别,在该级别下,事务串行化顺序执行.相当于数据库被设计成了单线程数据库.一致性最好,但是并发性最差,性能很低,一般很少使用.如果对一致性要求比较严格,而且并发量比较小的情况下可以考虑使用