1. 事务

1.1 查看是否自动提交事务

show varaibles like "autocommit';

1.2 事务的使用

开始事务:start transaction;

查mysql事务 查看mysql事务级别_mysql


开启另一个mysql 连接并执行查询

查mysql事务 查看mysql事务级别_事务隔离级别_02


在session1 的事务中更新数据并查询

update user set password=2 where username=1;

查mysql事务 查看mysql事务级别_事务隔离级别_03


在session2 中执行查询

查mysql事务 查看mysql事务级别_数据_04


session 1 提交事务

查mysql事务 查看mysql事务级别_数据_05


session 2中再次查询,可以看到数据已经改变

查mysql事务 查看mysql事务级别_事务隔离级别_06

注commit 为提交事务,rollback 为回滚日志。

1.3 事务的特性

  • 原子性:在一次事务中执行的数据库操作,要么全部成功,要么全部失败。
  • 一致性:事务操作前和操作后都必须满足业务规则约束,如支付业务,a 账户扣款要和b账户收款的金额保存一致。
  • 隔离性:数据库允许多个并发事务同时对数据进行读写。
  • 持久性:事务完成后 ,对数据的修改是永久的

2. 事务隔离

2.1 查看事务隔离级别

show variables like "tx_isolation";

2.2 修改事务隔离级别

set session transaction isolation level 隔离级别

2.3 mysql 的事务隔离级别

  1. 未提交读(read-uncommitted)
    在一个事务中,可以读到其他事务未提交的数据。但是,当其他事务回滚并未真正的修改数据时,读到的数据和真实的数据不一致,这种现像也叫做脏读。
  2. 读已提交 (read-commited)
    在一次事务中,只能读到其他事务已经提交的数据。事务a 读取数据记录A,事务b 对数据记录A中的某条数据进行了修改并提交数据,此时事务a 用相同条件查询时获得的是有记录A 不同的记录B ,这种现像也叫做不可重复读。
  3. 可重复读(repetable-read)
    mysql 的默认事务隔离级别,即在一次事务中,反复读取到的数据是一样的,
    并一直不会发生变化,避免了脏读、不可重复读现象,但是它还是无法解决幻读问题。对幻读的解释:例如事务 T1 对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务 T2 又对这个表中插入了一行数据项为“1”的数据,并且提交给数据库。而操作事务 T1 的用户如果再查看刚刚修改的数据,会发现数据怎么还是 1?其实这行是从事务 T2 中添加的,就好像产生幻觉一样,这就是发生了幻读。
  4. 可串行化serializable
    强制事务串行执行,避免了前面所说的幻读现像