MySQL事务整理

事务?

事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取。事务的正确执行使得数据库从一种状态转换为另一种状态时对应的数据结果的正确性。

事务必须服从ACID原则,原子性、一致性、隔离性、持久性。

1.原子性

一个事务是一个不可分割的最小单位,一个事务中的操作要么都成功提交,要么都失败回滚,不可以只执行事务中的某部分的操作。

2.一致性

一致性确保了数据的完整性,比如在一个事务处理中的银行转账不能只加钱不减钱。

3.隔离性

一个事务所做的操作在完全提交之前对其他事务是不可见的。

4.持久性

一个事务在提交之后所做的修改会被永久的保存在数据库中,此时如果系统崩溃也不会丢失、影响数据。

 

多个事务并发产生的问题

 

1.脏读

A事务读到了B事务处理但还未提交的数据结果,例如A事务开启事务,切换到B事务取出100元但是未提交事务,切换到A事务A事务查询金额发现金额少了100元并进行对应的操作,B事务回滚恢复到原始的金额,但是A事务已经根据B事务的“取走100元”的操作做了对应的操作。一个通俗的例子B顾客向A商家卖东西,B客户向A商家转100元,A商家发现钱到账了,发货,B客户收到货物回滚了,结果A商家没钱了。

 

2.不可重复读

同个事务在事务中查询了两次同一个数据,但是两次查询结果不一样。例如A事务开启事务,A事务查询余额1000元,切换到A事务B事务取出100元并提交事务,切换到A事务A事务执行某个逻辑又查询了一次余额,发现余额只剩900元了。同一个A事务中两次查询的结果不一致。这对某些需要两次查询结果一致的业务会出现问题。

 

3.幻读

一个事务在事务中更新满足某种条件数据,更新后发现未被更新的数据。例如A事务开启事务,A事务将status字段为true的数据全部更新为false,处理完数据后此时A事务还未提交,切换到B事务B事务向数据库插入一条status为true的数据提交事务,切换到A事务A事务提交事务,结果发现有一条没有处理的数据。一般发生在并发事务中出现了修改,删除数据的操作。

 

事务隔离级别---------->解决上述事务并发的问题

 

事务隔离级别分四种,隔离级别越高并发事务产生的问题越少,不过性能消耗更大。为了将性能的损耗降到最低,需要根据具体的问题选择最合适的隔离级别。

 

1. READ UNCOMMITTED(未提交读)

事务可以查看到其他事务未提交的操作,也就是事务可以读取未提交的数据,显然这会出现脏读的现象。

 

2.READ COMMITTED(提交读)

事务只能查看到其他已提交的事务,也就是说一个事务只能看得见已经提交了的事务所做的修改。显然该隔离级别可以防止脏读的出现,但是无法防止不可重复读的现象出现。

 

3.REPEATABLE READ(可重复读)

一个事务中多次读取同一记录的数据结果是一致的,就是在一个事务中读取某条记录后,对该行记录加锁,在该事务提交之前其他事务不允许进行更新该条记录的操作。这样就解决了脏读、不可重复读的问题,但是无法防止幻读的问题。

 

4.SERLALIZABLE(可串行化)

这是最高的事务隔离级别,它强制让处理同一记录的事务强制串行执行,也就是每个事务都要排队执行。解决了脏读、不可重复读、幻读的问题。由于他会对事务中读取的每一个数据进行加锁,会导致大量的锁竞争和超时现象。

 

盗图一张

标题

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值