2016年9月8日 星期四

[Spring] Annotation @Transactional 的各項 屬性

[Spring] Annotation @Transactional 的各項 屬性

用 spring 事務管理器,由spring來負責資料庫的打開,提交,回滾.

默認遇到運行期例外
(throw new RuntimeException();)會回滾:


unchecked,需要捕獲的例外(throw new Exception();)不會回滾:

checked.需要修改規則加入注釋:

@Transactional(rollbackFor=Exception.class) //指定回滾,需要捕獲的例外(throw new Exception(“");)不會回滾
public void methodName() {
throw new Exception(“");
}

@Transactional(noRollbackFor=Exception.class)//指定不回滾,遇到運行期例外
(throw new RuntimeException(“");)會回滾
public ItimDaoImpl getItemDaoImpl() {
throw new RuntimeException(“");
}

//事務傳播屬性
//如果有事務,那麼加入事務,沒有的話新建一個(不寫的情況下)
@Transactional(propagation=Propagation.REQUIRED)

//容器不為這個方法開啟事務
@Transactional(propagation=Propagation.NOT_SUPPORTED)

//不管是否存在事務,都創建一個新的事務,原來的掛起,新的執行完畢,繼續執行老的事務
@Transactional(propagation=Propagation.REQUIRES_NEW)

//必須在一個已有的事務中執行,否則拋出異常
@Transactional(propagation=Propagation.MANDATORY)

//必須在一個沒有的事務中執行,否則拋出異常(與Propagation.MANDATORY相反)
@Transactional(propagation=Propagation.NEVER)

//如果其他bean調用這個方法,在其他bean中聲明事務,那就用事務.如果其他bean沒有聲明事務,那就不用事務.
@Transactional(propagation=Propagation.SUPPORTS)
/*public void methodName(){
update();//本類的修改方法 1
otherBean.update();//調用其他類的修改方法
update();//本類的修改方法 2
}
other失敗了不會影響 本類的修改提交成功,本類update的失敗,other也失敗
*/
@Transactional(propagation=Propagation.NESTED)

//readOnly=true唯讀,不能更新,刪除
@Transactional (propagation = Propagation.REQUIRED,readOnly=true)

//設置超時時間
@Transactional (propagation = Propagation.REQUIRED,timeout=30)


//設置資料庫隔離級別
@Transactional (propagation = Propagation.REQUIRED,isolation=Isolation.DEFAULT)


code:

import java.util.List;
import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.hx.springjdbc.bean.Login;
import com.hx.springjdbc.service.LoginService;

@Transactional
public class LoginServiceImpl implements LoginService {

private JdbcTemplate jdbcTemplate;

public void setDataSource(BasicDataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}

//@Transactional(rollbackFor = Exception.class)
@Transactional(noRollbackFor=RuntimeException.class)
public void delete(int id) throws Exception {
jdbcTemplate.update(“delete from Login where id=?",
new Object[] { id }, new int[] { java.sql.Types.INTEGER });
//throw new Exception();
throw new RuntimeException();
}

//不支援事務
@Transactional(propagation=Propagation.NOT_SUPPORTED)
public Login getLogin(int id) {
// TODO Auto-generated method stub
return (Login) jdbcTemplate.queryForObject(
“select * from Login where id=?", new Object[] { id },
new LoginRowMapper());
}
@SuppressWarnings(“unchecked")
public List getLogins() {
return (List) jdbcTemplate.query(“select * from Login",
new LoginRowMapper());
}
@Transactional(propagation=Propagation.NOT_SUPPORTED)
public void save(Login login) {
jdbcTemplate.update(“insert into login(name) values(?)",
new Object[] { login.getName() },
new int[] { java.sql.Types.VARCHAR });
}

public void update(Login login) {
jdbcTemplate.update(“update Login set name=? where id=?", new Object[] {
login.getName(), login.getId() }, new int[] {
java.sql.Types.VARCHAR, java.sql.Types.INTEGER });
}

設定檔:
<!– 採用注解方式使用事務 –>

沒有留言 :

張貼留言