如何配置以在Spring + JDBC中关闭自动提交? - java

我在JDBC中使用Spring,发现它是自动提交的。

如何配置以在spring-servlet.xml中将其关闭?

这是我当前的配置:

<bean id="dataSource"
    class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
    p:driverClassName="${jdbc.driverClassName}"
    p:url="${jdbc.databaseurl}" p:username="${jdbc.username}"
    p:password="${jdbc.password}" />

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"/>
</bean>

参考方案

看来我的配置错过了这一行:

<tx:annotation-driven transaction-manager="txManager"/>

然后,在我的服务类中,我使用@Transactional批注。例如

@Service
class CompanyServiceImpl implements CompanyService{
    @Autowired
    private CompanyDAO companyDAO;

    @Transactional
    public void addCompany(Company company) {
            companyDAO.addCompany(company); // in here, there is JDBC sql insert
            companyDAO.addCompany_fail(company); // just for test
    }
}

如果addCompany_fail()中发生异常,则第一个addCompany()也将被回滚。

我阅读了这份文档,以了解在Spring中如何控制事务。
http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html

我阅读了本文档,以了解如何在Spring中使用JDBC进行编码。
http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/jdbc.html

我还阅读了这个(免费)http://www.infoq.com/news/2009/04/java-transaction-models-strategy。真的很好。我对作者的看法是,大多数人都不了解(或关心)交易。

PS:
似乎很多人误解了使用这样的Hibernate / Spring框架只是为了避免JDBC和事务控制的复杂性。许多人认为,“JDBC和事务是如此复杂,只需使用Hibernate而不用考虑这两者”。互联网上有关Spring + Hibernate或Spring + JDBC的许多示例似乎根本不在乎事务。我觉得这是个坏笑话。交易太严重了,以至于在没有真正理解的情况下让某些事情来处理。

Hibernate和Spring是如此强大且如此复杂。然后,就像有人说的那样,“强大的力量伴随着责任”。

更新:2013-08-17:此处有关于事务的好示例http://www.byteslounge.com/tutorials/spring-transaction-propagation-tutorial。但是,这并不能说明如果您想使用REQUIRES_NEW,为什么需要创建另一个类(否则,您将得到Spring Transaction propagation REQUIRED, REQUIRES_NEW这个问题,看来REQUIRES_NEW并没有真正创建新的事务)

更新时间:2018-01-01:我已经使用Spring Boot 1.5.8创建了一个完整的示例。
还有一些基本的实验示例https://www.surasint.com/spring-boot-database-transaction-jdbi/

在Java中,执行“ ++++++++”表达式,编译器未报告任何错误并且可以正确执行? - java

我用eclipse编写了这段代码,用war写过,结果为3d。public static void main(String[] args) { double a = 5d + + + + + +-+3d; System.out.println(a); } 参考方案 您的表情可以改写为(5d) + (+ + + + +-+3d) 其中第一个+是应用于两个操作数的…

Hibernate通过非主键获取实体并更新它+ Spring MVC - java

当我使用其ID检索对象并更改其属性并更新它时,一切正常,但是当我使用其名称+版本获取对象并更新它们时,所有更改都不会保存在数据库中。您能不能让别人让我知道是什么问题?//通过id获取public PdfDocument get(Long id) { return (PdfDocument) session().get(PdfDocument.class, i…

Java值加变量++ - java

考虑以下代码int val1 = 3; val1++; int val2 = val1++; System.out.println(val1); System.out.println(val2); Val1值= 5;Val2值= 4;为什么Val1的值是“ 5”?据我了解,应该为4,因为:在第1行,它的赋值为3,在第2行,通过val1 ++加上1,结果val…

为什么C++中的void方法可以返回void值,而在其他语言中却不能呢? - java

该程序可以用C ++编译并运行,但不能使用多种不同的语言,例如Java和C#。#include <iostream> using namespace std; void foo2() { cout << "foo 2.\n"; } void foo() { return foo2(); } int main() {…

Spring XML中的公共值配置 - java

我有几个Spring bean,其中所有属性值之一都是相同的String值。有没有一种方法可以在XML中一次定义此String并在属性值设置的所有bean中引用它?<bean id="somebean" class="test.SomeBean"> <property name="prope…