Java Spring framework uygulamalarında, “Transactional”(org.springframework.transaction.annotation.Transactional) anotasyonu ile bir database işlemini (örneğin, bir veri ekleme işlemi) bir transaction içinde gerçekleştirebilirsiniz. Bu anotasyonun bir parametresi olarak “rollbackfor” değeri verilebilir ve bu değer ile hangi exceptionlar için bir geri alma (rollback) yapılacağı belirtilebilir.
Yazıya başlamadan önce exceptionları ve bunların temel özelliklerini açıklayalım.
Java dilinde, bir “exception” (istisna) bir olası çalışma zamanı hatasıdır. Örneğin, bir dosya okuma işlemi sırasında dosyanın mevcut olmaması gibi. Bu tür hataları işleyebilmek için Java’da “Exception” sınıfı ve bu sınıftan türetilen birçok alt sınıf vardır.
Java dilinde “checked exception” ve “runtime exception” şeklinde iki tür exception vardır: Checked exceptionlar, “Exception” sınıfının türetilmiş sınıflarıdır ve genellikle geliştirici tarafından öngörülebilir ve yönetilebilir hatalardır. Örneğin, bir dosya okuma işleminde dosyanın mevcut olmaması, uygulama özelinde isteklere karşılık vermesi için hazırlanan business exceptionlar geliştirici tarafından hazırlananıp, özel bir şekilde işlenebilir.
Runtime exceptionlar ise “RuntimeException” sınıfı ve bu sınıftan türetilen sınıflardır. Bu tür exceptionlar genellikle geliştirici tarafından öngörülemeyen ve yönetilemeyen hatalardır. Örneğin, bir değişkenin null olduğu zaman bu değişkene ulaşmaya çalışılması gibi. Bu tür exceptionlar genellikle geliştirici tarafından özel bir şekilde işlenmez, ancak JVM tarafından otomatik olarak yakalanır ve işlenir.
Eğer “Transactional” anotasyonu kullanırken “rollbackfor” değeri verilmezse, varsayılan olarak sadece runtime exceptionlar için geri alma (rollback) yapılır. Bu, Spring tarafından varsayılan olarak ayarlanmış bir davranıştır ve bu davranışı değiştirebilmek için “rollbackfor” değerini vermeniz gerekir.
Örneğin, aşağıdaki gibi bir metod oluşturalım.
1 2 3 4 5 | @Transactional public void addData(Data data) { // repository.save(data); } |
Bu metod içinde bir runtime exception oluştuğunda (örneğin, bir değişkenin null olduğu zaman bu değişkene ulaşmaya çalışılması durumunda alınan NullPointException gibi) bir geri alma (rollback) yapılır. Ancak bir checked exception oluştuğunda (örneğin, bir dosya okuma işleminde dosyanın mevcut olmaması, ya da uygulama içinde custom olarak checked exception olarak oluşturulmuş exceptionlar.) geri alma yapılmaz.
Eğer checked exceptionlar için de geri alma (rollback) yapmak istiyorsak, “rollbackfor” değerini vermeniz gerekir.
1 2 3 4 5 | @Transactional(rollbackFor = Exception.class) public void addData(Data data) { // repository.save(data); } |
Bu örnekte, “addData” metodu içinde herhangi bir exception oluştuğunda bir geri alma (rollback) yapılır.
Eğer sadece belirli bir tür exception için geri alma yapmak istiyorsanız, o exception sınıfını “rollbackfor” değerine vermeniz gerekir. Örneğin;
1 2 3 4 | @Transactional(rollbackFor = FileNotFoundException.class) public void addData(Data data) { // repository.save(data); } |
Bu örnekte, sadece “FileNotFoundException” türünde exceptionlar için geri alma yapılır.
Farklı exceptionları da yakalamak için aşağıdaki örnekteki gibi çoklu parametre verilebilir.
1 2 3 4 | @Transactional(rollbackFor = {FileNotFoundException.class,ApplicationBusinessException.class}) public void addData(Data data) { // repository.save(data); } |
Bu örnekte “FileNotFoundException” ve “ApplicationBusinessException” türündeki exceptionlar için geri alma işlemi yapılır.
Bir sonraki yazıda görüşmek üzere.