mysql的事物和隔离级别

修改事物的隔离级别:
修改配置文件:transaction-isolation = {read uncommitted| read commited| repeatable read| serializable}
命令行改变单个绘画或者所有新进连接得隔离级别:set [session| global] transaction isolation level {read-uncommitted| read-commited| repeatable-read| serializable}
注意:不带session和global是为下一个绘画设置事物隔离级别,使用global在全局对之后所有连接设置事物隔离级别,使用session为当前连接后续执行事务设置隔离别别

查询事务隔离级别:
mysql8以后:
select @@transaction_isolation;
select @@global.transaction_isolation;
select @@session.transaction_isolation;

mysql8以前:
select @@tx_isolation;
select @@global.tx_isolation;
select @@session.tx_isolation;

隔离级别:

隔离级别 脏读 不可重复度 幻读
未提交读 可能 可能 可能
已提交读 不可能 可能 可能
可重复读 不可能 不可能 可能
串行化 不可能 不可能 不可能



未提交读:允许脏读,第一个事物可能读取到第二个事物未提交的修改(增,删,改)数据
已提交读:只能读到已提交的数据,不可重复读
可重复读:事物未结束时,读取到的内容总是相同的
串行化:每次读都是表级共享锁,一个事物的读操作,也会阻塞另一个事物的修改操作

脏读:一个事物正在修改数据但未提交,另一个事物可以访问到该数据
不可重复读:第一个事物内,多次读取同一数据,第二个事物修改该数据并提交,在第一个事物中可能两次读取的数据不同
可重复读:第一个事物内,多次读取同一数据,第二个事物插入数据并提交,在第一个事物中不会立马读取到第二个事物的修改,两次读取的数据相同,直到事物结束才能看到第二个事物中的修改数据
幻读:第一个事务对表中的数据进行了修改,这种修改涉及到表中的全部数据行。第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样
注意:当隔离级别是可重复读,且禁用innodb_locks_unsafe_for_binlog的情况下,在搜索和扫描index的时候使用的next-key locks可以避免幻读。

第一个事物对表结构的修改会被阻塞,即使第二个事物是select查询;

for update只锁定满足条件的行:SELECT * FROM 表名 WHERE 条件 FOR UPDATE;

如果使用普通的读(select * from 表名),会得到一致性的结果,如果使用了加锁的读(for update或者lock in share mode),就会读到“最新的”“提交”读的结果。在默认的可重复读的隔离级别里,可以使用加锁读去查询最新的数据(提交读)。

猜你喜欢

转载自blog.csdn.net/qq_39581763/article/details/91040571