关系型数据库的事务隔离级别
概要
数据库隔离级别是关系型数据库保障事务生命周期过程中几个层次的数据安全策略。
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大;而隔离级别越低,事务并发性越强,但同时会出现与业务情况相背的数据情况。如果系统压力偏大而业务数据能支持较强的容错情况,我们可以选择相对较低的事务隔离级别,在个别应用场景可以由应用程序采用悲观锁或乐观锁来控制低级别事务隔离级别引出的数据安全情况;而数据一致性需求较强的应用场景,如果系统压力并不大且在一个可控的压力范围之内,我们可以选择较高的事务隔离级别支持,甚至可以选择最高的串行执行的隔离级别Serializable。
事务完整性
事务完整性可以用ACID特性来衡量事务的质量,违反事务完整性的问题有3类:脏读、不可重复读和幻像读。
ACID:原子性(atomicity),一致性(consistency),隔离性(isolation),持续性(durability)
原子性:事务是原子的,要不全部完成,要不全部失败。
一致性:保证数据库的一致性,事务执行之前是一致的,执行之后也是一致的。
隔离性:每个事务必须和其他事务产生的结果隔离开来。
持续性:事务的持续性指不管系统发生了什么故障,事务处理的结果都是永久的,数据库产品必须保证,即使存放数据的驱动器融化了,也能将数据库恢复到驱动器融化之前,即最后一个事务提交的瞬间状态。
事务缺陷:脏读、不可重复读、幻像读
1)脏读
读取了其它事务未提交的数据。
2)不可重复读
对于单行数据来说。事务A两次读取的数据不一致,因为看到的是事务B提交前后的数据,自然不一致。
3)幻像读
对于多行数据来说。事务A两次读取的行数不一致,因为在其过程中正巧事务B修改并提交了满足事务A查询条件的记录。
几种隔离级别
以JDBC中Connection的事务隔离级别定义来说明:
1)Read Uncommitted(TRANSACTION_READ_UNCOMMITTED)
事务A可以读取到事务B未提交的数据,如果事务B发生异常回滚,事务A读取到的将是脏数据。此事务隔离级别的应用场景中将出现脏读、不可重复读和幻像读这几种情况。
2)Read Committed(TRANSACTION_READ_COMMITTED)
事务A可以读取到事务B已经提交的数据,不可读取到事务B未提交的数据,避免了脏读,但没有避免不可重复读和幻像读。
3)Repeatable Read(TRANSACTION_REPEATABLE_READ)
可以回避脏读、不可重复读的情况,但无法避免幻像读。
4)Serializable(TRANSACTION_SERIALIZABLE)
防止所有的事务缺陷,适用于绝对的事务完整性的要求比性能更为重要的情况,银行帐务系统、高度竞争性的销售数据库,等等,可以选择使用Serializable。
事务隔离级别查看及修改
1)DB2
默认:Read Committed
查看:
修改:a.DB2SET DB2_SQLROUTINE_PREPOPTS=RR|RS|CS|UR
b.db2 change isolation to UR
c.SELECT * FROM tablename WITH UR
(RR-Serializable、RS-Repeatable Read、CS-Read Committed、UR-Read Uncommitted)
2)Oracle
默认:Read Committed
查看:
修改:set transaction isolation level serializable(Oracle只有read committed 和 serializable)
3)Sybase
默认:Read Committed
查看:select @@isolation
修改:set transaction isolation level 0
(level 3-Serializable、level 2-Repeatable Read、level 1-Read Committed、level 0-Read Uncommitted)
4)Sql Server
默认:Read Committed
查看:
修改:set transaction isolation level read uncommitted
5)Mysql
默认:Repeatable Read
查看:select @@tx_isolation;
修改:set transaction isolation level read uncommitted;
阅读(1400) | 评论(0) | 转发(0) |