Skip to main content

SELECT ... FOR UPDATE with Spring JDBC

SELECT ... FOR UPDATE is required to lock specific row in database in order to prevent other query thread to read or make changes to the same row. The lock is released once you update the data or commit it.

As a Spring lover, it's hard to find references about implementing the technique in Spring JDBC template. But finally I managed to use it.


public MyDao {
    private PreparedStatementCreatorFactory queryForUpdateFactory;

    public MyDao() {
        queryForUpdateFactory = new PreparedStatementCreatorFactory(
            "SELECT name FROM people WHERE id = ? FOR UPDATE",
            Arrays.asList(new SqlParameter(Types.INTEGER)));

        // These lines are important!
        queryForUpdateFactory.setUpdatableResults(true);
        queryForUpdateFactory.setResultSetType(
            ResultSet.TYPE_SCROLL_SENSITIVE);
    }


    public void testSelectForUpdate() {
        Object id = "someID";

        PreparedStatementCreator psc = 
            queryForUpdateFactory.newPreparedStatementCreator(
            new Object[] { id });

        RowCallbackHandler rch = new RowCallbackHandler() {
            @Override
            public void processRow(ResultSet rs) throws SQLException {
                String name = rs.getString("name");

                // Do some manipulation
                if (name != "Jack") {
                    name = "Jack Sparrow";
                }

                // Update and release the lock
                rs.updateString("name", name);
            }

        };

        jdbcTemplate.query(psc, rch);
    }
}

I hope it's useful!

Comments

Tried this with an in-memory H2 database. The select worked fine, but I couldn't get the update part to work.
Muhammad Ichsan said…
Did you manage to run the SQL without Spring?
O Noon Noeito said…
You need to add a "rs.updateRow()" after the "rs.updateString()" in order to "update" the actual row.
Hello, do you think it's possible to do a select for update like this :

1)

jdbc.query(MY_QERY_STRING, new MyMapper());

2) in the mapRow function just do :
rs.updateString("blabla","value");
rs.updateRow();

Thanks
shuron said…
Do i need this special parameters with Spring's Jdbc Templates? How to set them?
Hi

Nice article, however I have a question, how about if the select is a join on 2 tables ?
would still

rs.updateString("blabla","value");
rs.updateRow();


this work ? how would oracle know which primary key this belongs to ?

thansk !
quan anh said…
cách làm kem dưỡng da mặt từ thiên nhiênVới gel nha đam, bạn có thể bôi trực tiếp lên da như một loại kem dưỡng nhé. Đặc biệt gel này thích hợp với những ngày thời tiết khô, hay các bạn thường xuyên ngồi phòng điều hòa đó nha!
cách làm kem dưỡng da từ dầu dừaĐổ dung dịch vừa tạo được vào lọ thủy tinh và cất trong ngăn mát tủ lạnh. Vậy là xong rồi các bạn nha!
cách làm kem dưỡng da từ sữa tươiCho phần thịt nha đam vào máy xay hoặc cối giã. Đồng thời cho vitamin, dầu dừa (tỉ lệ ½ với nha đam) rồi xay nhuyễn.
cách làm kem dưỡng da từ nha đamDùng dao để tách lớp vỏ ngoài nha đam, các bạn nhờ là chỉ lấy phần thịt nha đam bên trong thôi nhé. Tránh dính lớp nhựa và vỏ xanh ngoài cùng dễ gây dị ứng.
cách làm kem dưỡng da từ bí đaoTrước hết bạn hãy rửa tay thật sạch với xà bông diệt khuẩn.
cách làm kem dưỡng trắng da từ thiên nhiênĐối với làn da, nha đam có thể giúp làm sạch mụn, se khít lỗ chân lông, dưỡng trắng da nè. Còn với tóc, nha đam sẽ giúp tóc bạn khỏe và mượt mà hơn đó nha.
cách làm kem dưỡng da từ mật ongThông thường, bạn chỉ cần dùng nha đam tươi, hết hợp với một số nguyên liệu khác là đã có thể làm đẹp rồi đó.
cách làm kem dưỡng da bằng sáp ongLàm trắng da từ mướp nghe có vẻ lạ nhưng đó là sự thật, quả mướp có chứa rất nhiều dưỡng chất tốt cho da mặt, đặt biệt là công dụng làm trắng và sáng da.
cách làm kem dưỡng da ban đêm từ thiên nhiênChanh là một loại quả không chỉ giàu vitamin C, tốt cho sức khỏe mà nó có công dụng làm đẹp.
cách làm kem dưỡng da từ sáp ongTheo các chuyên gia về sức khỏe và làm đẹp thì việc đắp mặt nạ bằng sữa chua có đường không gây ảnh hưởng đến làn da của chị em phụ nữ tuy nhiên nó không tốt bằng sữa chua không đường
cách làm kem dưỡng da từ lô hộiNhư chúng ta đã biết thì chanh là một nguyên liệu có khả năng làm đẹp rất tuyệt vời.

Popular posts from this blog

Distributed OSGi services in JBoss Fuse

JBoss Fuse (Fuse ESB) is a great container featuring Apache Karaf as OSGi container. It has a great feature called Fabric, on which you can start another container efficiently and do provisioning from any container connected in one Fabric. It means that, you can uninstall bundles from in other container from your current container.

Fabric also allows a bundle to publish services and let them be consumed by other bundles. Not just by bundles in the same container, but in other bundles as long as publishers and consumers are connected in one Fabric.
I'm here not to to tell you how to use JBoss Fuse or what it is. But to tell you that it's been hard to find references about how to publish services and consume them in distributed environment. So, I want to share my experience to handle that with blueprint or with Spring DM 1.x.x based on scattered sources of information I have read for weeks.

Bagaimana Ujian SIM C secara sukses di SatPas Daan Mogot

Atas berkat rahmat Allah Yang Maha Pengasih lagi Maha Penyayang, saya berhasil mendapatkan SIM C secara legal dalam 1 kali kedatangan yakni sore tadi (23 Januari 2010). Makasih ya Allah.

Sorry, kali ini saya berbicara non IT. Mungkin ini adalah momen bersejarah bagi saya yang perlu direkam dalam blog saya dan ini juga merupakan sesuatu yang sangat penting untuk dibagikan kepada orang lain, seperti halnya judul blog saya "Let's share"