事务概念
什么是事务?: 多条sql语句,要么全部成功,要么全部失败。
事务的特性:
数据库事务特性:原子性(Atomic)、一致性(Consistency)、隔离性(Isolation)、持久性 (Durabiliy)。简称ACID。
原子性:组成一个事务的多个数据库操作是一个不可分割的原子单元,只有所有操作都成功, 整个事务才会提交。任何一个操作失败,已经执行的任何操作都必须撤销,让数据库返回初始 状态。
一致性:事务操作成功后,数据库所处的状态和它的业务规则是一致的。即数据不会被破坏。 如A转账100元给B,不管操作是否成功,A和B的账户总额是不变的。
隔离性:在并发数据操作时,不同的事务拥有各自的数据空间,它们的操作不会对彼此产生干扰
持久性:一旦事务提交成功,事务中的所有操作都必须持久化到数据库中。
什么是脏读、幻读和不可重复读
脏读:读到了其他事务还没有提交的数据。
就比如,现在有两个事务,事务1在修改了id为1的数据,还没提交事务,事务2此时查询id为1的数据。
不可重复读:对某数据进行读取过程中,有其他事务对数据进行了修改(UPDATE、DELETE),导致第二次读取的结果不同。
幻读:事务在做范围查询过程中,有另外一个事务对范围内新增或删除了记录(INSERT,DELETE),导致范围查询的结果条数不一致。还有一个例子,当查询一条数据时,发现没有,但是使用insert增加数据时,又发现是已经存在。
事务的隔离级别
所谓事务隔离级别,是数据库管理系统(DBMS)中用于定义事务处理过程中不同事务之间可见性和相互影响程度的一套标准。
事务隔离级别的主要目的是平衡数据的一致性和系统的并发性,一般来说更高的隔离级别虽然能提高数据的一致性,但同时也可能降低系统的并发能力。
mysql有4种隔离级别来解决脏读、幻读、不可重复读等这些异常情况,从高到底依次为:
可串行化(Serializable)
可重复读(Repeatable reads)
提交读(Read committed
未提交读(Read uncommitted)
未提交读(Read uncommitted)是最低的隔离级别。通过名字我们就可以知道,在这种事务隔离级别下,一个事务可以读到另外一个事务未提交的数据。这种隔离级别下会存在幻读、不可重复读和脏读的问题。
提交读(Read committed)也可以翻译成读已提交,通过名字也可以分析出,在一个事务修改数据过程中,如果事务还没提交,其他事务不能读该数据。所以,这种隔离级别是可以避免脏读的发生的。
可重复读(Repeatable reads),由于提交读隔离级别会产生不可重复读的读现象。所以,比提交读更高一个级别的隔离级别就可以解决不可重复读的问题。这种隔离级别就叫可重复读。但是这种隔离级别没办法彻底解决幻读。
可串行化(Serializable)是最高的隔离级别,前面提到的所有的隔离级别都无法解决的幻读,在可串行化的隔离级别中可以解决。