session.tx_isolation; 为某个会话变量赋值 /*④为某个会话变量赋值*/ set @@session.tx_isolation='read-uncommitted';set @@tx_isolation='read-committed '; set session tx_isolation='read-committed'; set tx_isolation='read-committed'; 效果: mysql> select @@ tx_isolation; +----------------+ | @@tx_isolation | +----------------+ | READ-COMMITTED | +---------- ------+ 1 row in set, 1 warning (0.00 sec) mysql> set tx_isolation='read-committed'; Query OK, 0 rows (0.00 sec) mysql> select @@tx_isolation; +----------------+ | @@tx_isolation | +----------------+ | READ-COMMITTED
MySQL事务学习-->隔离级别 1 在my.cnf中设置,在mysqld选项中如下设置 [mysqld] transaction-isolation = READ-COMMITTED 2 在mysql ] mysql> select @@tx_isolation; +----------------+ | @@tx_isolation | +----------------+ | READ-COMMITTED mysql> system cat /usr/local/mysql56m2/my.cnf |grep transaction-isolation transaction-isolation = READ-COMMITTED | REPEATABLE-READ | +-----------------+ 1 row in set (0.00 sec) mysql> set tx_isolation='READ-COMMITTED mysql> select @@tx_isolation; +----------------+ | @@tx_isolation | +----------------+ | READ-COMMITTED
2.2 隔离级别为READ-COMMITTED & innodb_rollback_on_timeout =OFF a) 测试过程 session A session B mysql> show 2.4 隔离级别为READ-COMMITTED & innodb_rollback_on_timeout =ON a) 参数调整 mysql> set global transaction_isolation ='READ-COMMITTED';mysql> exit# 重新登录mysql> show global variables like 'transaction_isolation';+------ 小结 在MySQL8.0 中,仅有在隔离级别为READ-COMMITTED & innodb_rollback_on_timeout =ON情况下,事务中有超时回滚报错时,超时前sql也会回滚。 隔离级别 innodb_rollback_on_timeout 结果 REPEATABLE-READ OFF 超时回滚前的SQL不会自动回滚 READ-COMMITTED OFF 超时回滚前的SQL不会自动回滚
事务隔离级别 SQL 标准定义了四个隔离级别: READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读; READ-COMMITTED 隔离级别 脏读 不可重复读 幻影读 READ-UNCOMMITTED √ √ √ READ-COMMITTED × √ √ REPEATABLE-READ × × √ SERIALIZABLE × × 隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是READ-COMMITTED(读取提交内容):,但 InnoDB 存储引擎默认使用的 REPEATABLE-READ(可重读)并不会有任何性能损失
不同的数据库厂商对 SQL标准 中规定的四种隔离级别支持不一样: Oracle 就只支持 read-committed 和 serializable 隔离级别。 MVCC 只在read-committed和repeatable-read 两个隔离级别下工作,其他两个隔离级别: read-uncommitted,总是读取最新的数据行,而不会读当前事务版本的数据行。 前面我们说过:MVCC 只在 read-committed 和 repeatable-read两个隔离级别下工作,而 read-committed 和 repeatable-read 的区别就在于它们生成 update user set name = '源宝 4 ' where id = 1 这时候版本链就是︰ read-committed —— 每次查询数据前都生成一个 ReadView trx_ids read-committed、repeatable-read 这两个隔离级别的一个很大不同就是:生成ReadView 的时机不同 read-committed 在每一次进行普通 select 操作前都会生成一个
读已提交:READ-COMMITTED 3. 可重复读:REPEATABLE-READ 4. 串⾏:SERIALIZABLE上⾯4中隔离级别越来越强,会导致数据库的并发性也越来越低。 ---+ | Variable_name | Value | +-----------------------+----------------+ | transaction_isolation | READ-COMMITTED 步骤,修改⽂件、重启mysql,如下: 修改mysql中的my.init⽂件,我们将隔离级别设置为:READ-UNCOMMITTED,如下: # 隔离级别设置,READ-UNCOMMITTED读未提交,READ-COMMITTED 结论:读未提交情况下,可以读取到其他事务还未提交的数据,多次读取结果不⼀样,出 现了脏读、不可重复读 READ-COMMITTED:读已提交 将隔离级别置为READ-COMMITTED # 隔离级别设置 ,READ-UNCOMMITTED读未提交,READ-COMMITTED读已提交,REPEATABLEREAD可重复读,SERIALIZABLE串⾏ transaction-isolation=READ-COMMITTED
而环境B的隔离级别应该是READ-COMMITTED,提交读,什么是提交读?就是只要事务提交了,那你就能读到修改的数据。 Q3.在auto_commit=on,隔离级别是READ-COMMITTED,T3时刻,session1能否看到session2在T2时刻提交的数据? Q4.在auto_commit=off,隔离级别是READ-COMMITTED,T3时刻,session1能否看到session2在T2时刻提交的数据? 回 答 Q1.能。 Q3.能 在auto_commit=on,隔离级别是READ-COMMITTED,session1能看到session2在T2时刻提交的数据。 Q4.能 在auto_commit=off,隔离级别是READ-COMMITTED,session1能看到session2在T2时刻提交的数据。
在SQL标准中定义了四种事务的隔离级别,它们分别是:读未提交(READ-UNCOMMITTED)、读已提交(READ-COMMITTED)、可重复读(REPEATABLE-READ)和可序列化读(SERIALIZABLE 达梦数据库支持三种事务隔离级别:读未提交(READ-UNCOMMITTED)、读提交(READ-COMMITTED)和串行化(SERIALIZABLE)。 ---------------------------------------1ISOLATION_LEVEL1ReadCommited#从输出的信息可以看出,DM数据库默认的事务隔离级别是读已提交(READ-COMMITTED 由于达梦数据库默认的事务隔离级别是读已提交(READ-COMMITTED),因此在达梦数据库中默认是不存在脏读问题的。
/data/mysql_5720/tmp/mysql.sock 1 268435456 OFF /data/mysql_5720/data/ utf8 2025720 5.7.16-10-log 7 READ-COMMITTED /data/mysql_5721/tmp/mysql.sock 1 268435456 OFF /data/mysql_5721/data/ utf8 2025721 5.7.16-10-log 7 READ-COMMITTED /data/mysql_5722/tmp/mysql.sock 1 268435456 OFF /data/mysql_5722/data/ utf8 2025722 5.7.16-10-log 7 READ-COMMITTED /data/mysql_5723/tmp/mysql.sock 1 268435456 OFF /data/mysql_5723/data/ utf8 2025723 5.7.16-10-log 7 READ-COMMITTED /data/mysql_5724/tmp/mysql.sock 1 268435456 OFF /data/mysql_5724/data/ utf8 2025724 5.7.16-10-log 7 READ-COMMITTED
----+ | tx_isolation | REPEATABLE-READ | +---------------+-----------------+ --修改当前session级别的隔离方式为READ-COMMITTED ----------+ | Variable_name | Value | +---------------+----------------+ | tx_isolation | READ-COMMITTED @localhost[(none)]> set global transaction isolation level serializable; --注意,在root会话中 session级别还是为READ-COMMITTED ----------+ | Variable_name | Value | +---------------+----------------+ | tx_isolation | READ-COMMITTED session.tx_isolation; +------------------------+ | @@session.tx_isolation | +------------------------+ | READ-COMMITTED
session.tx_isolation; 为某个会话变量赋值 /*④为某个会话变量赋值*/ set @@session.tx_isolation='read-uncommitted'; set @@tx_isolation='read-committed '; set session tx_isolation='read-committed'; set tx_isolation='read-committed'; 效果: mysql> select @@ tx_isolation; +----------------+ | @@tx_isolation | +----------------+ | READ-COMMITTED | +---------- ------+ 1 row in set, 1 warning (0.00 sec) mysql> set tx_isolation='read-committed'; Query OK, 0 rows 0.00 sec) mysql> select @@tx_isolation; +----------------+ | @@tx_isolation | +----------------+ | READ-COMMITTED
READ-COMMITTED隔离级别 查询当前事务隔离级别: greatsql> show variables like 'transaction_isolation'; +-------------- Variable_name | Value | +-----------------------+----------------+ | transaction_isolation | READ-COMMITTED ---------+-----------+-----------+-------------+-----------+ 2 rows in set (0.00 sec) 可以看出事务隔离级别设置为READ-COMMITTED INSERT...SELECT语句是否对查询表加锁跟事务隔离级别有关,REPEATABLE-READ隔离级别下加共享读锁,此共享读锁属于Nextkey lock,会影响其他事务对查询表的DML操作;READ-COMMITTED
隔离级别分为4种: 读未提交:READ-UNCOMMITTED 读已提交:READ-COMMITTED 可重复读:REPEATABLE-READ 串行:SERIALIZABLE 上面4中隔离级别越来越强 结论:读未提交情况下,可以读取到其他事务还未提交的数据,多次读取结果不一样,出现了脏读、不可重复读 READ-COMMITTED:读已提交 将隔离级别置为READ-COMMITTED # 隔离级别设置, READ-UNCOMMITTED读未提交,READ-COMMITTED读已提交,REPEATABLE-READ可重复读,SERIALIZABLE串行 transaction-isolation=READ-COMMITTED 将隔离级别置为REPEATABLE-READ # 隔离级别设置,READ-UNCOMMITTED读未提交,READ-COMMITTED读已提交,REPEATABLE-READ可重复读,SERIALIZABLE 读已提交(READ-COMMITTED)通常用的比较多。
5.1 通过非索引字段查询 我们首先来看一下条件字段不使用索引的例子: session1 session2 set session transaction_isolation='READ-COMMITTED ';/* 设置会话隔离级别为RC*/ set session transaction_isolation='READ-COMMITTED';/* 设置会话隔离级别为RC*/ begin; use muke 5.2 通过唯一索引查询 我们再来看一下条件字段有唯一索引的例子: session1 session2 set session transaction_isolation='READ-COMMITTED ';/* 设置会话隔离级别为RC*/ set session transaction_isolation='READ-COMMITTED';/* 设置会话隔离级别为RC*/ begin;use muke RC*/ set session transaction_isolation='READ-COMMITTED';/* 设置会话隔离级别为RC*/ begin; begin; use muke;select
mysql port= 3306 character-set-server= utf8 default_storage_engine= InnoDB transaction_isolation = READ-COMMITTED mysql port = 3316 character-set-server = utf8 default_storage_engine = InnoDB transaction_isolation =READ-COMMITTED
用户自定义函数和存储过程执行结果也不确定会导致主从数据不一致 <3>一些内置函数可能无法复制 <4>未使用索引的update语句需要进行全表扫描,基于语句的复制可能比基于行复制锁定的行数多 注意基于语句的复制在隔离级别为read-committed Variable_name | Value | +-----------------------+----------------+ | transaction_isolation | READ-COMMITTED | | tx_isolation | READ-COMMITTED | +-----------------------+----------------+ mysql> insert
读已提交 把事务隔离级别设置为 READ-COMMITTED(如已设置,忽略此步骤): SET transaction_isolation = 'READ-COMMITTED'; -- 确认设置成功 Variable_name | Value | +-----------------------+----------------+ | transaction_isolation | READ-COMMITTED
REPEATABLE-READ:可重复读 将隔离级别置为REPEATABLE-READ # 隔离级别设置,READ-UNCOMMITTED读未提交,READ-COMMITTED读已提交,REPEATABLEREAD 将隔离级别置为REPEATABLE-READ # 隔离级别设置,READ-UNCOMMITTED读未提交,READ-COMMITTED读已提交,REPEATABLEREAD可重复读,SERIALIZABLE 将隔离级别置为SERIALIZABLE # 隔离级别设置,READ-UNCOMMITTED读未提交,READ-COMMITTED读已提交,REPEATABLEREAD可重复读,SERIALIZABLE串 读已提交(READ-COMMITTED)通常⽤的⽐较多。 总结 1. 理解事务的4个特性:原⼦性、⼀致性、隔离性、持久性 2.
READ-COMMITTED隔离级别 查询当前事务隔离级别: greatsql> show variables like 'transaction_isolation'; +-------------- Variable_name | Value | +-----------------------+----------------+ | transaction_isolation | READ-COMMITTED ---------+-----------+-----------+-------------+-----------+ 2 rows in set (0.00 sec) 可以看出事务隔离级别设置为READ-COMMITTED INSERT...SELECT语句是否对查询表加锁跟事务隔离级别有关,REPEATABLE-READ隔离级别下加共享读锁,此共享读锁属于Nextkey lock,会影响其他事务对查询表的DML操作;READ-COMMITTED
session.tx_isolation; 为某个会话变量赋值 /*④为某个会话变量赋值*/ set @@session.tx_isolation='read-uncommitted'; set @@tx_isolation='read-committed '; set session tx_isolation='read-committed'; set tx_isolation='read-committed'; 效果: mysql> select @ @tx_isolation; +----------------+ | @@tx_isolation | +----------------+ | READ-COMMITTED | +--------- -------+ 1 row in set, 1 warning (0.00 sec) mysql> set tx_isolation='read-committed'; Query OK, 0 rows 0.00 sec) mysql> select @@tx_isolation; +----------------+ | @@tx_isolation | +----------------+ | READ-COMMITTED