mysql数据库事务的四大特性(ACID)
原子性:
事务是不可分割的最小的操作单元,要么全部成功,要么全部失败
一致性:
一致性是指数据从一种有效状态转换为另一种有效的状态
隔离性:
数据库系统提供的隔离机制,数据库在开启事务后,保证每个事务不受其他事务并发执行的影响,多个并发事务之间互相隔离.
持久性:
事务一旦提交或回滚,他对数据库的改变就是永久的(数据库的数据存在磁盘中)
如何理解数据库的一致性?
数据库一致性有两层含义(来自mysql事务“一致性”理解 - 掘金 (juejin.cn)):数据库的一致性其实包含两个层面。从数据库层面理解,“一致性”实际上是一组约束、规则。从业务层面讲,“一致性”实际上是指事务把数据库从一个有效的状态转移成另一个有效状态。
所谓一致性是数据库处理前后结果应与其所抽象的客观世界中真实状况保持一致。这种一致性是一种需要管理员去定义的规则。管理员如何指定规则,数据库就严格按照这种规则去处理数据。(来自(5条消息) 如何理解事务一致性?_转码失败的大龄码农的博客-CSDN博客)
隔离性中的隔离级别:
读未提交(read uncommitted):
读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据。
读已提交(read committed):
读已提交,顾名思义,就是只能读到已经提交了的内容.(是SQL Server和Oracle的默认隔离级别)
可重复读(repeated read):
可重复读,顾名思义,就是专门针对“不可重复读”这种情况而制定的隔离级别,自然,它就可以有效的避免“不可重复读”。而它也是MySql的默认隔离级别。
串行化(serializable):
这是数据库最高的隔离级别,这种级别下,事务“串行化顺序执行”,也就是一个一个排队执行。这种级别下,“脏读”、“不可重复读”、“幻读”都可以被避免,但是执行效率奇差,性能开销也最大,所以基本没人会用。
事务隔离级别中会出现的三种问题:
脏读:
一个事务读到另一个事务还没有提交的事务.
不可重复读:
一个事务先后读取了同一条数据,但是前后读取的数据的内容不同.
幻读:
一个事务A按照条件查询数据时,发现没有查询带到对应id(主键)的数据(说明可以插入此id的数据),此时事务B也正好插入了该id的数据,随后事务A在插入数据时,发现无法插入对应id数据,发现该id的数据已经存在了(ps,但此时事务A依旧无法查询到事务B插入的数据内容),仿佛出现了幻影.
关于幻读的理解这里有一篇文章有合理的解释