oracle和mysql的事务隔离级别还是很不一样的
Oracle 默认使用的事务隔离级别:READ-COMMITTED
在多用户数据库中,对数据并发访问(data concurrency)及数据一致性(data consistency)进行控制是两项极为重要的工作
三种需要阻止的现象是:
1、脏读(dirty read):一个事务读取了被其他事务写入但还未提交的数据。
2、不可重复读(nonrepeatable read):一个事务再次读取其之前曾经读取过的数据时,发现数据已被其他已提交的事务修改或删除。
3、幻读(phantom read):事务按照之前的条件重新查询时,返回的结果集中包含其他已提交事务插入的满足条件的新数据。
四种隔离级别(现在数据库主流是中间两种隔离级别)
READ-UNCOMMITTED: 未提交读 会出现脏读、不可重复读、幻读 ( 隔离级别最低,并发性能高 )
READ-COMMITTED: 提交读 会出现不可重复读、幻读问题(锁定正在读取的行)
REPEATABLE-READ: 可重复读 会出幻读(锁定所读取的所有行)
SERIALIZABLE: 序列化 保证所有的情况不会发生(锁表)
mysql> select @@global.tx_isolation; +-----------------------+ | @@global.tx_isolation | +-----------------------+ | REPEATABLE-READ | +-----------------------+ 1 row in set, 1 warning (0.00 sec)
设置事务的隔离级别:
默认的行为(不带session和global)是为下一个(未开始)事务设置隔离级别。如果你使用GLOBAL关键字,语句在全局对从那点开始创建的所有新连接(除了不存在的连接)设置默认事务级别。你需要SUPER权限来做这个。
使用SESSION 关键字为将来在当前连接上执行的事务设置默认事务级别。 任何客户端都能自由改变会话隔离级别(甚至在事务的中间),或者为下一个事务设置隔离级别
mysql> set autocommit=0; Query OK, 0 rows affected (0.00 sec) mysql> select @@session.autocommit,@@global.autocommit; +----------------------+---------------------+ | @@session.autocommit | @@global.autocommit | +----------------------+---------------------+ | 0 | 1 | +----------------------+---------------------+ 1 row in set (0.00 sec) mysql> set session transaction isolation level read uncommitted; Query OK, 0 rows affected (0.00 sec) mysql> SELECT @@GLOBAL.transaction_isolation, @@GLOBAL.transaction_read_only,@@SESSION.transaction_isolation, @@SESSION.transaction_read_only; +--------------------------------+--------------------------------+---------------------------------+---------------------------------+ | @@GLOBAL.transaction_isolation | @@GLOBAL.transaction_read_only | @@SESSION.transaction_isolation | @@SESSION.transaction_read_only | +--------------------------------+--------------------------------+---------------------------------+---------------------------------+ | REPEATABLE-READ | 0 | READ-UNCOMMITTED | 0 | +--------------------------------+--------------------------------+---------------------------------+---------------------------------+ 1 row in set (0.00 sec) mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; Query OK, 0 rows affected (0.00 sec) mysql> SELECT @@GLOBAL.transaction_isolation, @@GLOBAL.transaction_read_only,@@SESSION.transaction_isolation, @@SESSION.transaction_read_only; +--------------------------------+--------------------------------+---------------------------------+---------------------------------+ | @@GLOBAL.transaction_isolation | @@GLOBAL.transaction_read_only | @@SESSION.transaction_isolation | @@SESSION.transaction_read_only | +--------------------------------+--------------------------------+---------------------------------+---------------------------------+ | REPEATABLE-READ | 0 | READ-COMMITTED | 0 | +--------------------------------+--------------------------------+---------------------------------+---------------------------------+ 1 row in set (0.00 sec)