1: mysql的事务提交模式:默认是autocommit show variables like 'autocommit' 2:设置默认的提交模式: set autocommit = 0 3: 设置当前session的隔离级别 set session transaction isolation level read committed; 4: 其他转自 1.查看当前会话隔离级别 select @@tx_isolation; 2.查看系统当前隔离级别 select @@global.tx_isolation; 3.设置当前会话隔离级别 set session transaction isolatin level repeatable read; 4.设置系统当前隔离级别 set global transaction isolation level repeatable read; 5.命令行,开始事务时 set autocommit=off 或者 start transaction 关于隔离级别的理解 1.read uncommitted 可以看到未提交的数据(脏读),举个例子:别人说的话你都相信了,但是可能他只是说说,并不实际做。 2.read committed 读取提交的数据。但是,可能多次读取的数据结果不一致(不可重复读,幻读)。用读写的观点就是:读取的行数据,可以写。 3.repeatable read(MySQL默认隔离级别) 可以重复读取,但有幻读。读写观点:读取的数据行不可写,但是可以往表中新增数据。在MySQL中,其他事务新增的数据,看不到,不会产生幻读。采用多版本并发控制(MVCC)机制解决幻读问题。 4.serializable 可读,不可写。像java中的锁,写数据必须等待另一个事务结束 5: 我的理解 四种隔离级别: read uncommitted(读取未提交内容) 在这种级别,所有事务都可以'看到'未提交事务的执行结果。她可能会产生很多的问题。不太建议 read committed 大多数的数据库默认是这种隔离级别,而mysql 是repeatable read级别。它满足一个简单的定义:一个事务在开始时, 只能看见 已提交事务的结果, 即一个事务从开始到提交之前,所有的数据都是不可见的。 出现的问题: 一个用户运行同一条语句两次,结果可能不同 repeatable read (可重读) mysql 默认这种隔离级别。她可以确保同一个事务的多个实例可以并发的读取数据, 会'看到同样的数据行’。但是,她可能产生另一个问题- 幻读(简单的说, 当一个用户读取某一个范围的数据行,另一个事务在这个范围插入,当这个用户在次读取这个范围的数据行时, 就会产生所谓的'幻影’) 备注: InnoDB 和 Falcom 存储引擎通过MCC机制解决了幻影问题。(有时间在看) serializable (可串行化) 最高级别的隔离级, 她通过强制事务排序,使他们不产生冲突,从而解决幻读取问题。 但是会产生超时(Timecout)和 锁竞争(Lock contention) |
|
来自: 非常尛貝 > 《高性能mysql的读出笔记》