1. 事务
1.1 查看是否自动提交事务
show varaibles like "autocommit';
1.2 事务的使用
开始事务:start transaction;
开启另一个mysql 连接并执行查询
在session1 的事务中更新数据并查询
update user set password=2 where username=1;
在session2 中执行查询
session 1 提交事务
session 2中再次查询,可以看到数据已经改变
注commit 为提交事务,rollback 为回滚日志。
1.3 事务的特性
- 原子性:在一次事务中执行的数据库操作,要么全部成功,要么全部失败。
- 一致性:事务操作前和操作后都必须满足业务规则约束,如支付业务,a 账户扣款要和b账户收款的金额保存一致。
- 隔离性:数据库允许多个并发事务同时对数据进行读写。
- 持久性:事务完成后 ,对数据的修改是永久的
2. 事务隔离
2.1 查看事务隔离级别
show variables like "tx_isolation";
2.2 修改事务隔离级别
set session transaction isolation level 隔离级别
2.3 mysql 的事务隔离级别
- 未提交读(read-uncommitted)
在一个事务中,可以读到其他事务未提交的数据。但是,当其他事务回滚并未真正的修改数据时,读到的数据和真实的数据不一致,这种现像也叫做脏读。 - 读已提交 (read-commited)
在一次事务中,只能读到其他事务已经提交的数据。事务a 读取数据记录A,事务b 对数据记录A中的某条数据进行了修改并提交数据,此时事务a 用相同条件查询时获得的是有记录A 不同的记录B ,这种现像也叫做不可重复读。 - 可重复读(repetable-read)
mysql 的默认事务隔离级别,即在一次事务中,反复读取到的数据是一样的,
并一直不会发生变化,避免了脏读、不可重复读现象,但是它还是无法解决幻读问题。对幻读的解释:例如事务 T1 对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务 T2 又对这个表中插入了一行数据项为“1”的数据,并且提交给数据库。而操作事务 T1 的用户如果再查看刚刚修改的数据,会发现数据怎么还是 1?其实这行是从事务 T2 中添加的,就好像产生幻觉一样,这就是发生了幻读。 - 可串行化serializable
强制事务串行执行,避免了前面所说的幻读现像