如何解决为简单的Pojo数据对象打开自动提交?
| 在我的应用程序中,我将底层存储对象隐藏在接口后面,从而可以随意切换存储。 问题是,在测试休眠时,休眠似乎非常面向事务。我在该主题上能找到的所有内容(主要是官方文档)都说自动提交是不好的,应该很少使用。但是我的整个应用程序不是围绕Hibernate编写的,而是围绕接口编写的。这意味着从数据库获取数据是通过一种方法(例如工厂中的getobjects())而不是事务进行的。 既然我已经抽象了存储实现,那么自动提交正确的解决方案吗?还是有其他选择?解决方法
使用自动提交,并不意味着不再使用事务来访问数据。这仅表示每个语句现在都在其自己的事务中执行。事务在JDBC规范中定义的开始和终止时的确切实例。为了简洁起见,这通常取决于所执行语句的性质。
我不确定您的设计是如何实现的,但是非事务性系统通常会遇到三个问题。使用自动提交可能会重新引入这些问题中的一个或多个。
脏读
考虑应用程序中的线程A,该线程A将读取并更新实体,但不提交新值。考虑另一个读取相同实体并查看更新值的线程B。如果线程A要回滚它的更改,或者无法提交更新的值,则B本质上使用的是脏值,因为它执行了脏读。
就其自身而言,自动提交不会导致脏读。但是,如果您具有最初在单个事务中执行的一系列数据库读写操作,则在每次读/写操作之后提交该序列写入操作,将导致在另一个事务中进行脏读,因为您当前的事务可能会简单地回滚改变。
不可重复读
在事务的上下文中,在事务的上下文中两次读取同一实体(记录),并且在第二次读取时看到不同的值被视为不可重复读取。当其他事务提交了更改并正在进行的事务读取新值时,就会发生这种情况。
使用自动提交(或者宁愿在两个不同的事务中执行读取操作)很可能会导致不可重复的读取,因为同一线程中的两个读取操作都将在不同的事务上下文中执行,从而导致第二次读取看到承诺值(来自不同线程中的事务)。
幻影阅读
与不可重复读取非常相似,但不完全相同。在这种情况下,执行第二次读取的执行线程将以新记录的形式看到其他数据(而不是更新的数据)。
同样,出于相同的原因,使用自动提交很有可能导致应用程序中的幻像读取。
这些问题还将取决于所采用的数据库事务隔离级别,但是最终当人们使用ORM框架时,标记事务的开始和结束将留给应用程序开发人员。虽然各个读写操作可以通过数据库彼此隔离,但是由开发人员自行决定以确保工作在事务上下文中进行。使用自动提交更改每个操作的事务上下文。
TLDR
在执行事务活动时使用自动提交将意味着,如果在“业务事务上下文”期间失败,则无法执行回滚到安全状态。顺便说一句,正是出于这个原因,在JDBC中执行批处理更新时应该禁用自动提交。当真正需要在批处理末尾提交时,使用自动提交将强制对批处理中的每个更新进行一次提交。
我建议阅读《 Java事务设计策略》一书(作为免费电子书提供),以深入了解使用事务。
, 当然,可以在休眠配置XML中或以编程方式在SessionFactory上将属性“ hibernate.connection.autocommit \”设置为true。
从您的问题尚不清楚,仅在开始并在
getObjects(
)接口方法的Hibernate实现中提交事务后,究竟能给您带来什么好处?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。