Mysql事务隔离

事务的含义

事务是要保证一组数据库操作,要么全部成功,要么全部失败。

事务的特性

原子性、一致性、隔离性、持久性。
Mysql事务隔离

事务隔离性是为了什么

为了解决多个事务同时进行的时候,会出现脏读,不可重复读,幻读之类的问题。这样也会产生新的问题,就是隔离的越严实,sql的执行效率越低,所以需要在SQL执行效率和隔离性的严实程度二者之间找到一个平衡点,于是产生了四种标准的隔离级别。

隔离级别情况如下

读未提交 : 一个事务还没提交时,它的变更能被别的事务看到。
读提交 :一个事务提交之后,做的变更才会被其他事务看到。
可重复读:从一而终。
串行化:会对一行记录加锁,写加写锁,读加读锁,当锁冲突的时候,必须在一个事务完成之后,另一个事务才会继续执行。

不同隔离级别下的数据变化情况

Mysql事务隔离

  1. 当事务的隔离级别为
    读未提交的时候 ,一个事务的更改其他事务可以看到。
    于是 V1 V2 V3 都是2
  2. 读提交的时候:
    A不知道B在干啥,B干完才知道是啥,于是V1=1,V2 V3 =2
    3.可重复度; 言外之意是A 至死不渝,不撞南墙不回头,于是 V1 V2 都是1,V3为2
    4.串行化,就是一个插队罚站的人,当这个B 插入之后,自动赶出去,罚站,当A完成后,这个B才能上。
    V1 V2 1 V3 2

可以人为进行手动提交事务

1.显式的启动事务: begin 或 start transaction 提交 commit 回滚是 rollback
2.set autocommit=0 会将 语句的自动提交关掉,执行select 之后,事务就启动了,但不会提交
直到 commit 或 rollback,或 断开数据库连接。(会造成事务长连接问题)需要手动提交
建议 set autocommit=1 自动提交

查询长事务

select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60
用来查询超过60s的长事务