交易中的隔离级别

时间:2009-07-07 18:31:51

标签: database transactions isolation-level

我想知道达到交易隔离级别的最佳方法是什么? This is a good link可用的ISOLATION级别。

Blockquote如果有人可以解释交易的各种隔离级别

,那就太好了

4 个答案:

答案 0 :(得分:3)

更新澄清并纠正解释。

隔离级别仅表示您的事务有多少受其他并发事务的影响。隔离级别越高,受影响的程度越小。

努力将在cpu加载,内存加载和可能的提交延迟中体现出来。此外,写入冲突更可能出现在更高的隔离级别,这可能意味着您必须中止事务并重试整个事务。 (这仅影响执行更新或插入的事务,而不影响仅执行选择的事务。)

一般来说,经验法则是使用最低级别,为您的应用程序提供所需的一致性。

Read Committed模式提供的部分事务隔离适用于许多应用程序,并且该模式使用起来快速且简单;但是,它并不适用于所有情况。执行复杂查询和更新的应用程序可能需要比读取提交模式提供的数据库更严格一致的视图。

Serializable模式提供了严格的保证,即每个事务都可以看到数据库的完全一致的视图。但是,当并发更新使得无法维持串行执行的错觉时,应用程序必须准备重试事务。由于重做复杂事务的成本可能很高,因此仅当更新事务包含的逻辑足够复杂以至于它们可能在读提交模式下给出错误答案时,才建议使用可序列化模式。最常见的是,当事务执行几个必须看到数据库相同视图的连续命令时,Serializable模式是必需的。

http://www.postgresql.org/docs/8.4/interactive/transaction-iso.html非常好。)

答案 1 :(得分:1)

如果您不确定隔离级别的差异,请坚持默认值。改变水平可能会产生特殊的副作用。默认情况下,99%的申请都没有问题。

默认情况我觉得每个JDBC驱动程序都有所不同,虽然像JPA这样的一些框架可能会强制执行它,但我无法回想起来。最常见的默认值是read_committed,因为它在事务安全性和并发性之间提供了最佳的通用平衡。如果您选择不同的隔离级别,则会牺牲安全性或并发性,并且您必须意识到这种妥协。

答案 2 :(得分:0)

事务隔离级别是关于解决并发事务中的数据读取问题(当在一个事务中,我们读取另一个事务同时更改的相同数据)。

有 4 个隔离级别。每个人解决 1 个相关问题 + 之前所有级别的问题:

<头>
# 隔离级别 要解决的问题 问题描述
1 读未提交 丢失更新 只有最后一个并发事务会影响读取的数据。其他交易的影响丢失
2 读已提交 脏读 读取的数据被事务更改,然后回滚
3 可重复读取 不可重复读 第二次读取相同数据的结果不等于第一次读取,因为数据被读取之间的另一个事务改变了
4 序列化 幻读 相同参数选择的第二个数据与第一个不同,因为数据被另一个读取之间的事务改变了
  • 隔离级别是指数据库层。
  • 隔离级别是数据准确性和性能之间的权衡:级别越高,准确性越高,但速度越慢。
  • 默认的数据库级别通常是读提交 (PostgreSQL) 或可重复读 (MySQL)。

答案 3 :(得分:-1)

问题到底是什么?!

隔离级别定义DBMS使用的锁类型和锁粒度。锁定在DBMS的上下文中是必不可少的,因为事务可能由许多用户同时执行。更高的事务隔离 - 例如SERIALIZABLE - 更安全 - 您可以潜在地消除脏读和幻像更新 - 但由于序列化事务限制了并发性并因此妨碍了可伸缩性,因此会受到惩罚。

怎么办?构建应用程序,使得逻辑通过在绝对需要时明智地使用序列化事务来限制“坏数据”的可能性,但不会使并发性受到不必要的阻碍。