事务

122 阅读2分钟

事务的四大特性

原子性

整个事务的所有操作,要么全部执行成功,要么全部失败回滚。

一致性

数据库总数从一个一致性状态转换到另一个一致性状态。

隔离性

一个事务所作的修改在提交之前,对其他事务是不可见的。

持久性

一旦事务提交,则其所做的修改会永久保存在数据库中。


事务的隔离级别

READ UNCOMMITTED(未提交读)

事务中的修改,即使没有提交,对其他事务也可见。事务可以读取未提交的数据,也被成为脏读(Dirty Read)

脏读.jpeg


READ COMMITTED(提交读)

一个事务从开始到提交之前,所做的任何修改对其他事务是不可见的。这个级别也可叫做不可重复读。

不可重复读.png


REPEATABLE READ(可重复读)

该级别无法解决幻读问题。所谓幻读,指的是当某个事务在读取某个范围的记录时,另外一个事务又在该范围插入了新的记录,当值位的事务再次读取该范围的记录时,会产生幻行(Phantom Row)——即多出了几行数据。

幻读.png


SERIALIZABLE(可串行化)

强制事务串行执行,避免了幻读问题。


不可重复读和幻读的区别

(1) 不可重复读是读取了其他事务更改的数据,针对update操作

解决:使用行级锁,锁定该行,事务A多次读取操作完成后才释放该锁,这个时候才允许其他事务更改刚才的数据。

(2) 幻读是读取了其他事务新增的数据,针对insert和delete操作

解决:使用表级锁,锁定整张表,事务A多次读取数据总量之后才释放该锁,这个时候才允许其他事务新增数据。


MYSQL中的事务

自动提交(AUTOCOMMIT)

如果不是显示的开始一个事务,则每个查询都被仿作一个事务执行提交操作。