मैं एक विधि है, 'databaseChanges' है, जो 2 आपरेशन फोन है। 'ए' पहले, 'बी' आखिरी। 'ए' & 'बी' हो सकता है सी reate, यू pdate डी मेरी स्थायी भंडारण, Oracle डाटाबेस 11g में हटाएं कार्यक्षमताओं।रोल वापस एक अगर B गलत हो जाता है। पुनरावृत्ति तरह से ए, बी: वसंत बूट, jdbctemplate
मान लें,
'ए' तालिका उपयोगकर्ता में एक रिकॉर्ड को अद्यतन, विशेषता ज़िप, जहां आईडी = 1.
'बी' तालिका शौक में एक रिकॉर्ड डालें।
परिदृश्य: डेटाबेस चेंज विधि कहा जाता है, 'ए' रिकॉर्ड संचालित करता है और अद्यतन करता है। 'बी' चलाता है और एक रिकॉर्ड, कुछ होता है सम्मिलित करने के लिए प्रयास करते हैं, एक अपवाद दिया गया है, अपवाद databaseChanges विधि के लिए बुदबुदाती है।
अपेक्षित: 'ए' और 'बी' कुछ भी नहीं बदला। अद्यतन 'ए' किया, रोलबैक होगा। 'बी' ने कुछ भी नहीं बदला, ठीक है ... एक अपवाद था।
वास्तविक: 'ए' अपडेट वापस लुढ़का नहीं लगता है। 'बी' ने कुछ भी नहीं बदला, ठीक है ... एक अपवाद था।
private void databaseChanges(Connection conn) {
try {
conn.setAutoCommit(false);
A(); //update.
B(); //insert
conn.commit();
} catch (Exception e) {
try {
conn.rollback();
} catch (Exception ei) {
//logs...
}
} finally {
conn.setAutoCommit(true);
}
}
समस्या:
कुछ कोड
तो मैं संबंध नहीं था, मैं की तरह कुछ करना होगा मैं कनेक्शन (टैग को देखने की जरूरत नहीं है सवाल के साथ कि पोस्ट)
मैंने कोशिश की करने के लिए:
@Service
public class SomeService implements ISomeService {
@Autowired
private NamedParameterJdbcTemplate jdbcTemplate;
@Autowired
private NamedParameterJdbcTemplate npjt;
@Transactional
private void databaseChanges() throws Exception {
A(); //update.
B(); //insert
}
}
मेरे AppConfig वर्ग:
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
@Configuration
public class AppConfig {
@Autowired
private DataSource dataSource;
@Bean
public NamedParameterJdbcTemplate namedParameterJdbcTemplate() {
return new NamedParameterJdbcTemplate(dataSource);
}
}
'ए' अद्यतन करता है। 'बी' से एक अपवाद फेंक दिया गया है। 'ए' द्वारा किए गए अपडेट को वापस नहीं किया गया है।
मैं क्या पढ़ा से, मैं समझता हूँ कि मैं @Transactional सही ढंग से उपयोग नहीं कर रहा हूँ। मैंने पढ़ा है और मेरी समस्या को हल करने succeess बिना कई ब्लॉग पोस्ट और stackverflow क्यू & एक की कोशिश की।
कोई सुझाव?
संपादित
एक विधि है कि फोन databaseChanges() विधि
public void changes() throws Exception {
someLogicBefore();
databaseChanges();
someLogicAfter();
}
जो विधि @Transactional साथ एनोटेट किया जाना चाहिए,
परिवर्तन() नहीं है? databaseChanges()?
मैं कोशिश करूँगा, धन्यवाद! – lolo
काम नहीं कर रहा है। अपडेट – lolo
वापस नहीं चलाया गया है आप कक्षा (मेरे उदाहरण MyFacade में) इंजेक्शन कर रहे हैं, है ना? अन्यथा विशेषता सम्मानित नहीं की जाएगी। शायद आप एक बहुत ही सरल उदाहरण बना सकते हैं और सभी वर्गों को पोस्ट कर सकते हैं। फिर यह देखना आसान है कि और क्या गलत हो रहा है। – Guenther