# Springs @Transactional



## MQue (13. Jan 2010)

Hallo, 

ich schau mir gerade ein Rich Domain Beispiel an und es ist mir auch ziemlich klar, was ich nicht ganz verstehe ist, was @Transactional (unten) genau macht, @Service ist mir klar -> dem Spring Framework wird bekanntgegeben, dass es sich um einen Service handelt (was das dann bringt, hab ich auch noch nicht herausgefunden), @Autoowired ist klar, die DAOs werden in das Object injiziert, @Transactional ist mir in diesem Kontext nicht klar, @Transactional hat ja was mit Datenbanken zu tun aber was bringt mir das, wenn ich die Methode @Transactional deklariere?
Vielleicht könnte jemand kurz eine Erklärung abgeben,
Besten Dank,




```
@Service
public class ThinNewShoppingCartService implements ShoppingCartService {

	private ShoppingCartDao shoppingCartDao;
	private ProductDao productDao;
	
	@Autowired
	public ThinNewShoppingCartService(ShoppingCartDao shoppingCartDao, ProductDao productDao) {
		this.shoppingCartDao = shoppingCartDao;
		this.productDao = productDao;
	}
	
	@Transactional
	public void putInto(Long shoppingCartId, Long productId, int amount) throws ShoppingLimitExceededException {
		ShoppingCart cart = shoppingCartDao.getShoppingCartById(shoppingCartId);
		Product product = productDao.getProductById(productId);
		cart.add(product, amount);
	}
}
```


----------



## mvitz (13. Jan 2010)

@Service dient neben dem Dokumentationszweck auch noch der Autoerkennung von Spring. So erkannte Klassen, erkennt Spring (bei passender Configuration) automatisch und kann diese anschließend ohne Sie in der Configuration noch einmal zu deklarieren indizieren.

@Transactional definiert, dass diese Methode in einer Transaktion ablaufen soll.


----------



## Noctarius (13. Jan 2010)

Transactional hat nicht nur etwas mit Datenbanken zu tun, sondern es ist nur ein häufiger Anwendungsfall für Transactions. Transactions benutzt man allgemein aber immer da, wo man sicher gehen will, dass entweder alle Änderungen (Non-Atomic Changes) gemacht werden oder eben keine der Einzeländerungen um zu verhindern, dass ein inkonsistenter Zustand eintritt.

Ein schönes Beispiel, welches nur so halb auf der Datenbank basiert ist eine Transaktion (wie der Name schon sagt) bei einer Bank.
Eine Geld-Transaktion ist erst abgeschlossen wenn auf einem Konto aus- und auf einem anderen Konto eingebucht wurde. Sollte während der Überweisung ein Fehler auftreten wird kurzerhand das Geld auf dem Absenderkonto wieder eingebucht und somit die Änderung rückgängig gemacht (Rollback).

Ist zwar nur grob umrissen aber trifft den Punkt für eine Transaction.


----------



## MQue (13. Jan 2010)

mvitz hat gesagt.:


> @Service dient neben dem Dokumentationszweck auch noch der Autoerkennung von Spring. So erkannte Klassen, erkennt Spring (bei passender Configuration) automatisch und kann diese anschließend ohne Sie in der Configuration noch einmal zu deklarieren indizieren.
> 
> @Transactional definiert, dass diese Methode in einer Transaktion ablaufen soll.



Versteh, also wenn ich eine Klasse als @Service deklariere, dann brauch ich im Spring XML Konfigurationsfile nicht mehr <bean id= ... schreiben, hab ich das so richtig verstanden. Der Name der Spring Bean ist dann der Name der Klasse, oder?


----------



## byte (13. Jan 2010)

Ja. Dafür musst Du allerdings Component Scan aktivieren:

[XML]<context:component-scan base-package="org.example"/>[/XML]


----------

