数据库事务特性,隔离级别...

数据库事务之ACID

原子性(Atomicity):指的是事务是一个不可再分割的工作单元,要么事务中的所有操作都发生,要不都不发生

一致性(consistency):分为业务一致性数据库完整性,业务一致性是说不管事务是否成功,业务逻辑上是要正确一致的,比如:不论转账的事务操作是否成功,其两者的存款总额不变;数据库完整性指的是,事务执行后,数据符合表设置的约束,数据内部结构(B+树)必须是正确的

隔离性(isolation):多个事务并发访问时(特别是访问相同数据时),事务之间是不会相互影响的,比如:事务查看数据更新时,数据所处的状态要么是另一个事务修改前状态,要么是修改后状态,不会是中间状态

持久性(durable):每一次事务之后,数据都会保存在数据库中,持久化

数据库事务之隔离级别

未提交读(Read uncommitted):一个事务可以读取另一个未提交事务的数据,容易出现脏读的情况。

读提交:一个事务等另外一个事务提交之后才可以读取数据,但会出现不可重复读的情况(多次读取的数据不一致),比如去吃火锅,准备买单,一查,钱够,好,准备买单(而另一方面,你老婆刚好用你的卡刷了一个包包),输密码,发现钱不够了;读取过程中出现UPDATE操作,第二次读操作要等待刷包包完成后才能读取。解决了脏读的问题,但是出现了不可重复读问题

可重复读: 开始读取事务的时候,不再允许其他修改的事务操作。可以解决不可重复读问题,(mysql的innodb默认就是这个级别),但是由于只是只是禁止了对记录的修改操作,inset等操作是没有禁止的,所以但是还是会有幻读的问题,比如,事务A query记录数为n,事务B此时insert一条记录,事务A打印记录的时候就成了N+1

序列化:最高级别的事务隔离,所有事物串行处理(牺牲了效率)