1、mysql的事务
事务并发问题
单个线程在跑的时候,只要开启事务关闭事务中间,进行的操作,可以保证事务正确性,但如果是多线程并发情况下,肯定是不行的。
脏读
第一个事务开启后准备查数据,第二个事务开启后然后修改了数据,第一个事务读到了第二个事务修改过的数据,但是第二个事务修改了数据后,没有提交事务,回滚了。导致第一个事务读到的数据是错的。
不可重复读
第一个事务的线程正在读取一行数据,第二个事务的线程把这行数据给修改了,并且立马提交了事务,结果第一个事务读取的这行数据不是想要的期望的数据。
幻读
当第一个事务的线程正在读取一些数据,第二个事务的线程新增或删除了数据,第一个事务线程读取到数据后,第二个事务又提交了,这时第一个事务读到的数据就会有一些缺失的或者不存在的数据,好像发生了幻觉一样。
不可重复读和幻读的区别
不可重复读重点是修改了数据,幻读的重点是新增或删除了一些数据。
所以解决不可重复读只需要锁住一行数据就行了,幻读需要把整个表锁住。
事务特性ACID
原子性
最小颗粒,不可再拆分,一个事务中所有操作看成一个原子的操作,不可再拆分。一个事务中的所有操作要么都成功,要么都失败。
一致性
事务所执行的结果必须是数据库从一个一致性状态变成另一个一致性状态,数据库只包含事务提交成功的数据。
隔离性
多个事务执行时候互不干扰,多个事务互相之间都是隔离的,并发执行的事务之间不能看到其他事务的中间状态,不能相互影响。
持久性
事务一旦提交,对数据做任何改变,都要记录到永久存储器中,保存在物理数据库。即使数据出现故障,提交的数据也能恢复。
但是外部原因导致数据库故障,比如硬盘损坏,那之前提交的数据有可能丢失。
事务隔离级别
事务的隔离级别有如下几个:
mysql默认的隔离级别是REPEATABLE-READ
设置事务的隔离级别:
-- 查看默认隔离级别
select @@transaction_isolation;
-- 设置事务隔离级别 设置当前会话的隔离级别
set session transaction isolation level read uncommitted;
set session transaction isolation level read committed;
set session transaction isolation level repeatable read;
set session transaction isolation level serializable;
《三体》中有句话——弱小和无知不是生存的障碍,傲慢才是。
所以我们不要做一个小青蛙