理解MySQL(二)--数据库事务

时间:2022-09-24 09:08:31
理解MySQL(二)--数据库事务

1、事务:事务内的语句,要么全部执行成功,要么全部执行失败。

a)      数据库事务四要素:ACID,原子性,一致性,隔离性,持久性。

b)      原子性:一个事务必须被视为不可分割的最小单元。

c)      一致性:数据库是从一个一致性状态转换到另外一个一致性状态。

d)      隔离性:一个事务所做的修改在最终提交前,对其他事务是不可见的。

e)    持久性:一旦事务提交,其所做的修改就会被永久保存到数据库

2、 隔离级别:规定了一个事务所做的修改,,哪些在事务内和事务间是可见的,哪些是不可见的。较低级别的隔离可以执行更高的并发,系统的开销也更小。

a)      READ UNCOMMITED(未提交读):在该级别中,事务的修改,即使没有提交,对其他事务也是可见的事务可以读取未提交的数据,称为脏读。实际很少使用未提交读。

b)      READ COMMITED(提交读):一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。因为这个级别执行两次查询,可能会得到不同的结果,所以也被称为不可重复读

c)      PEREATABLE READ(可重复读):保证了在同一事务中多次读取同样记录的结果是一样的。但是该级别还无法解决幻读的问题。幻读,指的是当某个事务在读取某个范围的记录时,另外一个事务又在该范围插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行,也就是读取的记录数不同。可重复读是MySQL的默认事务隔离级别

d)      SERIALIZABLE(可串行化):最高的隔离级别,通过强制事务串行执行,避免了前面说的幻读的问题。简单来说,SERIALIZABLE会在读取的每一行数据上加锁,所以可能导致大量超时和锁争用问题。

隔离级别

脏读可能性

不可重复读可能性

幻读可能性

加锁读

READ UNCOMMITED

Yes

Yes

Yes

No

READ COMMITED

No

Yes

Yes

No

PEREATABLE READ

No

No

Yes

No

SERIALIZABLE

No

No

No

Yes

3、死锁:指的是两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。Innodb处理死锁的方式是将持有最少行级排他锁的事务进行回滚。

4、MySQL中的事务,可以通过实行SET TRANSACTION ISLATION LEVEL命令来设置隔离级别。

更新于2019.7.18