数据库事务四大特性及事务隔离级别在mysql中的具体体现
程序员文章站
2022-03-09 10:35:48
...
事务的四大特性
- 原子性
指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 - 一致性
指事务必须使数据库从一个一致性状态转换到另一个一致性状态。拿转账来说,不管如何转账,钱的总数不变。 - 隔离性
指多个用户访问数据库时,用户为每个数据库开启的事务,不能被其他事务的操作数据干扰,多个并发事务之间要相互隔离。 - 永久性
指一个数据一旦提交,它对数据库中数据的改变是永久的。
事务的隔离级别
- 脏读
指一个事务读取了另一个数据未提交的数据 - 不可重复读
指一个事务读取表中同一行的数据,每次读取到的数据不同。主要是有update语句引起的,读取到了另一个事务提交后的数据。 - 虚读
指一个事务读取到了另一个事务插入的数据,主要有insert语句引起。
这三种隔离级别依次提高,但隔离级别并不是越高越好,因为安全性越高,效率也就越低。
mysql中的隔离级别
- read uncommitted(脏读、不可重复读、虚读都有可能发生)
- read committed(避免脏读,不可重复读、虚读有可能发生)
- repeatable read(避免脏读、不可重复读,虚读有可能发生)
-
serializable(避免脏读、不可重复读、虚读)
查看mysql的隔离级别:
select @@tx_isolation;
设置mysql的隔离级别:
set transaction isolation level 四个隔离级别
mysql中四种隔离级别的体现:
出现脏读:
左边的事务设置了隔离级别为脏读、不可重复读、虚读都有可能发生,当右边的事务执行update语句但没有提交时,在左边可以看到数据的改变,当右边的事务rollback时,左边的事务又发生变化:
这就是发生了脏读,一个事务读到了另一个事务没有提交的数据,如果右边的事务rollback,左边的数据读取到的数据就是无效的数据,所以称为发生了脏读。
当设置隔离级别为read committed即可避免脏读:
当右边的事务没有提交时,左边的事务无法读到改变的数据,只有当右边的事务提交后,左边的事务才能看到数据的变化:
这种情况也叫发生了不可重复读,因为左边事务读取到的数据发生了变化,刚开始a的money是1000,后面又成了1100。
当设置事务隔离级别为repeatable read时,可以避免不可重复读:
可以看到,即使右边的事务提交了,左边的事务依旧看不到数据变化,只有当左边的事务也提交,在查询是才能看到数据变化,这样就避免了不可重复读。但此时虚读仍有可能发生。