2009-06-21 39 views
9

Tôi đang làm việc trên một ứng dụng Java có sử dụng các lớp Spring IoC và JDBC Template. Tôi có một lớp DAO có 4 phương thức: m1() đến m4(). m1 thực hiện nhiều chèn và cập nhật trên bảng t1, t2 m2 trên bàn, m3 trên t3 vvGiao dịch dễ dàng bằng Spring JDBC?

Các phương pháp DAO được sử dụng như sau:

while(true) 
{ 
    //process & generate data 

    dao.m1(data1); 
    dao.m2(data2); 
    dao.m3(data3); 
    dao.m4(data4); 

    //sleep 
} 

Tôi muốn các hoạt động db dưới 4 phương pháp liên tiếp gọi là nguyên tử, hoặc tất cả 4 bảng được cập nhật thành công hoặc không có gì. Vì vậy, nếu có lỗi trong khi thực hiện các hoạt động theo m3(), tôi muốn khôi phục tất cả các thay đổi (cập nhật & chèn) được thực hiện trong m2 & m1.

Vậy mùa xuân cho phép bạn làm điều đó theo cách sau?

while (true) 
{ 
    //process & generate data 

    transaction = TransactionManager.createNewTransaction(); 

    transaction.start() 

    try 
    { 
    dao.m1(data1); 
    dao.m2(data2); 
    dao.m3(data3); 
    dao.m4(data4); 
    } 
    catch(DbUpdateException e) 
    { 
    transaction.rollBack(); 
    } 

    transaction.end(); 

    // sleep 

}

hay có những cách tốt hơn để làm điều đó?

Trả lời

8

Để hoàn chỉnh, giải pháp theo chương trình sẽ là:

private TransactionTemplate transactionTemplate; 

public setTransactionManager(PlatformTransactionManager transactionManager) { 
    this.transactionTemplate = new TransactionTemplate(transactionManager); 
} 

... 

while (true) { 

    transactionTemplate.execute(new TransactionCallbackWithoutResult() { 
    protected void doInTransactionWithoutResult(TransactionStatus status) { 
     try { 
     dao.m1(data1); 
     dao.m2(data2); 
     dao.m3(data3); 
     dao.m4(data4); 
     } catch(DbUpdateException e) { 
     status.setRollbackOnly(); 
     } 
    } 
    }); 
} 
1

Có, bạn có thể thực hiện các cuộc gọi đó trong một phương thức và chỉ định các giao dịch của mình declaratively.

Bạn không cần phải thêm mã đó - Spring có thể làm điều đó cho bạn.

15

Có Mùa xuân cho phép bạn programmatically control transactions.

Cá nhân tôi thích declarative transactions sử dụng chú thích, mà đi như thế này:

public void runBatchJob() { 
    while (true) { 
    // generate work 
    doWork(unitOfWork); 
    } 
} 

@Transactional 
private void doWork(UnitOfWork work) { 
    dao.m1(data1); 
    dao.m2(data2); 
    dao.m3(data3); 
    dao.m4(data4); 
} 

nơi các chức năng DAO được định nghĩa:

@Transactional 
public void m1(Data data) { 
    ... 
} 

Điều này đòi hỏi trong bạn applicationContext.xml:

<tx:annotation-driven/> 

Declarat Giao dịch ive có thể được khai báo để yêu cầu giao dịch, yêu cầu giao dịch mới, giao dịch hỗ trợ, v.v. Rollback sẽ xảy ra khi khối được chú thích bằng @Transactional ném số RuntimeException.

+0

Tôi không tin bạn cần chú thích m1, m2, v.v ... dưới dạng @Transactional. Nếu có một ngoại lệ, mọi thứ đã được hoàn thành bởi doWork sẽ được khôi phục. – Chadwick

+0

Bạn không cần phải trong ngữ cảnh này, không. Nhưng nếu họ đang thực hiện cập nhật, bạn nên chú thích chúng như yêu cầu giao dịch, nếu không bạn có thể thấy mình đang thực hiện cập nhật phi giao dịch nếu bạn gọi chúng bên ngoài ngữ cảnh doWork(). – cletus

+0

Chú thích @Transactional có làm bất kỳ điều gì khi được áp dụng cho phương pháp riêng tư không? –

1

mùa xuân có thể xử lý tất cả điều này cho bạn bằng cách sử dụng @Transactional như được giải thích hoặc trong XML nếu bạn muốn.

Điều nhập để nhận đúng là loại Tuyên truyền giao dịch bạn muốn tất cả tùy thuộc vào ứng dụng của bạn.

Theo mặc định, giao dịch sẽ bắt đầu nếu giao dịch không tồn tại và sẽ sử dụng lại giao dịch hiện tại nếu giao dịch đã bắt đầu. Đây là hành vi bạn muốn nếu bạn muốn tất cả 4 DAO là nguyên tử.

Đặt @Transactional trên một lớp sẽ quản lý các phương thức DAO được gọi là (MyService) - bất kỳ thứ gì bên dưới lớp này bây giờ sẽ tham gia vào ranh giới giao dịch đó.

i.e:

@Transactional 
public void m1(Data data) { 
... 
} 

@Transactional 
public void m2(Data data) { 
... 
} 

Làm điều này trong mã là hoàn toàn không cần thiết.

Xem here for more info

Các vấn đề liên quan