A, B 두개의 작업이 있다.
두 작업은 같은 SqlMapClient 객체를 통해 DB에 엑세스 한다.
다음은 테스트코드다.
import iMonES.Daemon.Main.CiMonESMain;
import java.sql.SQLException;
import com.ibatis.sqlmap.client.SqlMapClient;
import common.manager.DBConnection;
public class Test
{
private SqlMapClient sqlMapClient = DBConnection.getSqlMapClient();
public void success() throws SQLException
{
System.out.println("success 실행");
sqlMapClient.startTransaction();
sqlMapClient.startBatch();
for (int i = 0; i < 10000; i++)
{
sqlMapClient.insert("insertTest");
}
sqlMapClient.executeBatch();
sqlMapClient.commitTransaction();
sqlMapClient.endTransaction();
System.out.println("success 종료");
}
public void error1() throws SQLException
{
System.out.println("error1 실행");
sqlMapClient.insert("insertTestError");
System.out.println("error1 끝");
}
public void error2() throws SQLException
{
System.out.println("error2 실행");
sqlMapClient.startTransaction();
sqlMapClient.startBatch();
sqlMapClient.insert("insertTestError");
sqlMapClient.executeBatch();
sqlMapClient.commitTransaction();
sqlMapClient.endTransaction();
System.out.println("error2 종료");
}
public static void main(String[] args)
{
CiMonESMain.initOptManager();
final Test test = new Test();
Thread t1 = new Thread(new Runnable()
{
public void run()
{
try
{
test.success();
}
catch (SQLException e)
{
System.out.println(e.toString());
}
}
});
Thread t2 = new Thread(new Runnable()
{
public void run()
{
try
{
test.error1();
}
catch (SQLException e)
{
System.out.println(e.toString());
}
}
});
Thread t3 = new Thread(new Runnable()
{
public void run()
{
try
{
test.error2();
}
catch (SQLException e)
{
System.out.println(e.toString());
}
}
});
t1.start();
t3.start();
t2.start();
}
}
이 테스트 코드의 실행결과, 데이터베이스에는 success() 메서드의 결과는 insert 되어 있었지만 error1, error2 메서드의 실행결과는 빠져있었다.
즉, A메서드가 실행중일때 B메서드에서 예외가 발생하여도 A 작업은 문제없이 실행된다.