java 150 lines · 2 tabs

Database transactions and isolation levels

David Kumar Jan 2026
2 tabs
package com.example.demo.service;

import com.example.demo.model.Order;
import com.example.demo.model.OrderItem;
import com.example.demo.model.User;
import com.example.demo.repository.OrderRepository;
import com.example.demo.repository.UserRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class TransactionalService {

    private final OrderRepository orderRepository;
    private final UserRepository userRepository;
    private final EmailService emailService;

    public TransactionalService(OrderRepository orderRepository,
                               UserRepository userRepository,
                               EmailService emailService) {
        this.orderRepository = orderRepository;
        this.userRepository = userRepository;
        this.emailService = emailService;
    }

    // Basic transaction - rolls back on RuntimeException
    @Transactional
    public Order createOrder(Order order) {
        Order saved = orderRepository.save(order);
        updateUserLastOrderDate(order.getUserId());
        return saved;
    }

    // Custom rollback rules
    @Transactional(rollbackFor = Exception.class,
                   noRollbackFor = IllegalArgumentException.class)
    public void processOrder(Long orderId) throws Exception {
        Order order = orderRepository.findById(orderId)
            .orElseThrow(() -> new Exception("Order not found"));
        // Process order
    }

    // Read-only transaction for optimization
    @Transactional(readOnly = true)
    public List<Order> findOrdersByUser(Long userId) {
        return orderRepository.findByUserId(userId);
    }

    // New transaction - always starts fresh transaction
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void logOrderCreation(Long orderId) {
        // This runs in separate transaction, commits independently
        System.out.println("Order created: " + orderId);
    }

    // Nested transaction
    @Transactional(propagation = Propagation.NESTED)
    public void updateOrderItems(Long orderId, List<OrderItem> items) {
        // Can rollback to savepoint without affecting outer transaction
        Order order = orderRepository.findById(orderId).orElseThrow();
        order.setItems(items);
        orderRepository.save(order);
    }

    // Isolation level to prevent phantom reads
    @Transactional(isolation = Isolation.SERIALIZABLE)
    public long countPendingOrders() {
        return orderRepository.countByStatus("PENDING");
    }

    // Transaction with timeout
    @Transactional(timeout = 30)
    public void processBatchOrders(List<Order> orders) {
        orders.forEach(orderRepository::save);
    }

    // Complex transaction orchestration
    @Transactional
    public Order createOrderWithNotification(Order order) {
        Order saved = orderRepository.save(order);

        // This runs in new transaction, commits even if outer fails
        logOrderCreation(saved.getId());

        // This can fail without rolling back log
        emailService.sendOrderConfirmation(saved);

        return saved;
    }

    private void updateUserLastOrderDate(Long userId) {
        User user = userRepository.findById(userId).orElseThrow();
        user.setLastOrderDate(java.time.LocalDateTime.now());
        userRepository.save(user);
    }
}
2 files · java Explain with highlit

Spring's @Transactional manages database transactions declaratively. Transaction propagation controls behavior when methods call other transactional methods—REQUIRED, REQUIRESNEW, NESTED. Isolation levels prevent concurrent access issues—READUNCOMMITTED, READCOMMITTED, REPEATABLEREAD, SERIALIZABLE. Rollback rules specify which exceptions trigger rollback—default is unchecked exceptions. Timeout prevents long-running transactions. Read-only transactions optimize performance for queries. Programmatic transactions with TransactionTemplate offer finer control. Distributed transactions use JTA for multiple resources. Proper transaction boundaries ensure data consistency. Over-broad transactions harm performance; too narrow ones risk partial updates. Understanding ACID properties guides correct transaction usage. Transaction management is critical for data integrity in production systems.


Related snips

go
package dbutil

import (
  "context"

  "github.com/jackc/pgconn"

Retry Postgres serialization failures with bounded attempts

go postgres transactions
by Leah Thompson 1 tab
graphql
type User {
    id: ID!
    name: String!
    email: String!
    posts: [Post!]!
    createdAt: String!

GraphQL API with Spring Boot

java graphql spring-boot
by David Kumar 3 tabs
ruby
class SignupForm
  include ActiveModel::Model
  include ActiveModel::Attributes

  attribute :account_name, :string
  attribute :email, :string

Shallow Controller, Deep Params: Form Object Pattern

rails activemodel form-object
by codesnips 3 tabs
ruby
# Vulnerable: user input is concatenated directly into SQL.
email = params[:email]
password = params[:password]

sql = "SELECT * FROM users WHERE email = '#{email}' AND password_hash = '#{password}'"
user = ActiveRecord::Base.connection.execute(sql).first

SQL injection prevention with unsafe and safe query patterns

sql-injection owasp database
by Kai Nakamura 3 tabs
java
package com.example.starter.config;

import com.example.starter.properties.CustomProperties;
import com.example.starter.service.CustomService;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;

Custom Spring Boot starters

java spring-boot starter
by David Kumar 4 tabs
sql
-- EXPLAIN ANALYZE (actual execution statistics)
EXPLAIN ANALYZE
SELECT u.username, COUNT(o.id) AS order_count
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE u.created_at >= '2024-01-01'

Advanced query optimization techniques

database optimization query-performance
by Maria Garcia 2 tabs

Share this code

Here's the card — post it anywhere.

Database transactions and isolation levels — share card
Link copied