一 查询数据库事务隔离级别:
1. MySQL 查询: select @@tx_isolation; 默认级别: REPEATABLE-READ 支持四种级别
2. Oracle 查询: 可以通过select flag from v$transaction(判断值) 默认级别: read committed 只支两种级别
二 设置事务隔离级别:只允许[read committed | serializable]
1. alter session set ISOLATION_LEVEL = read committed 设置当前session隔离级别
2. SET TRANSACTION ISOLATION LEVEL READ COMMITTED; 设置当前事物的隔离级别
二 ANSI事务隔离性级别:
标准的隔离性级别由ANSI SQL标准定义,但是它们不是SQL数据库特有的。JTA也定义了完全相同的隔离性级别。隔离性级别的增加带来了更高成本以及严重的性能退化和可伸缩性:
1.丢失更新(lost update): 一个事物因异常撤消会影响到另一个事物,只要数据库支持事物,就不会出现实种情况.
2.脏读(dirty read):当一个事务读取另一个事务尚未提交的修改时,就会产生脏读.
3.非重复读(nonrepeatabe read):同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。(A transaction rereads data it has previousy read and finds that another committed transaction has modified or deeted the data. )
4.幻读(phantom read):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读。(A transaction reexecutes a query returning a set of rows that satisfies a search condition and finds that another committed transaction has inserted additiona rows that satisfy the condition. ) (注:主要针对插入操作)
ANSI/ISO SQ92标准定义了一些数据库操作的隔离级别:
Dirty Read | NonRepeatabe Read | Phantom Read | |
Read uncommitted | Possible | Possible | Possible |
Read committed | not possible | Possible | Possible |
Repeatabe read | not possible | not possible | Possible |
Seriaizabe | not possible | not possible | not possible |