数据库中事务的四大特性(ACID)
-
原子性(Atomicity)
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
-
一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
-
隔离性(Isolation)
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
-
持久性(Durability)
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
数据库的隔离级别
mysql 中用来查询当前隔离级别的语句,5 的版本是 select @@tx_isolation; 8 版本的是 select @@transaction_isolation;
-
Read uncommitted (读未提交)
一个事务可以读取另一个未提交事务的数据。最低级别,任何情况都无法保证。
-
Read committed (读已提交, mysql默认)
就是一个事务要等另一个事务提交后才能读取数据,可避免脏读的发生
-
Repeatable read (可重复读)
重复读,就是在开始读取数据(事务开启)时,不再允许修改操作。可避免脏读、不可重复读的发生
-
Serializable (串行化)
是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。
不同隔离级别产生的问题
-
脏读
脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。主要是修改带来的问题。
-
不可重复读
不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。主要是修改带来的问题。
-
虚读(幻读)
幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。主要是新增带来的问题。