Tôi đang cố gắng để có được các giao dịch JDBC rollback khi sử dụng Spring-test mà không thành công. Khi tôi chạy bản cập nhật SQL sau đây luôn được cam kết.Khôi phục giao dịch trên các thử nghiệm Spring JDBC
package my.dao.impl;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
import org.springframework.test.context.transaction.TransactionConfiguration;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.Statement;
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class})
@ContextConfiguration(locations={"classpath:ApplicationContext-test-DAOs.xml"})
@TransactionConfiguration(defaultRollback = true)
public class ConfirmationMatchingDAOImplTest {
@Autowired
private DataSource dataSource;
@Test
public void shouldInsertSomething() throws Exception {
final Connection connection = dataSource.getConnection();
final Statement statement = connection.createStatement();
statement.executeUpdate("insert into TEST_INSERT values (1, 'hello')");
statement.close();
connection.close();
}
}
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
<property name="url" value="jdbc:sqlserver://makeitfunky:1490;databaseName=fonzie"/>
<property name="username" value="ralph"/>
<property name="password" value="p0n1es_R_kew1"/>
</bean>
Tôi đang làm gì sai?
Ngoài ra, tôi có đang sử dụng quá nhiều chú thích không? Tôi có thể làm cho nó sạch hơn một chút không?
Tôi đã xóa @TestExecutionListeners và thêm @Transactional. Sau đó, tôi đã phải thêm bean transactionManager vào ngữ cảnh ứng dụng (DataSourceTransactionManager). Txn không được khôi phục vì vậy tôi đã thêm @TransactionConfiguration (defaultRollback = true). Txn vẫn chưa được khôi phục vì vậy tôi đã thêm @Rollback vào phương thức thử nghiệm. Chỉ sau đó tôi mới thấy Spring log rằng nó đã quay trở lại txn, nhưng bản cập nhật vẫn được tiếp tục tồn tại cho DB. Một cái gì đó để làm với SQL Server và trình điều khiển của nó có lẽ? – Synesso
Đã thêm DataSourceUtils vào câu trả lời của tôi. –
Ah, tôi không nhận được thông báo về nhận xét cuối cùng của bạn. Trong khi đó, tôi đã thay đổi bối cảnh của mình để bọc nguồn dữ liệu trong một TransactionAwareDataSourceProxy. Điều đó hiệu quả. Vì vậy, có bạn đi, hai cách để làm điều tương tự. Bây giờ, hãy xem chú thích nào trong số 7 chú thích này mà tôi có thể loại bỏ và vẫn có công việc. – Synesso