首页 > 代码库 > Spring 的 @Transactional
Spring 的 @Transactional
Spring业务的传达行动
在service类前加上@Transactional,声明这个service一切办法需求业务管理。每一个业务办法开始时都会翻开一个业务。
Spring默许情况下会对运行期破例(RunTimeException)进行业务回滚。这个破例是unchecked
假如遇到checked意外就不回滚。
如何改动默许规矩:
1 让checked破例也回滚:在整个办法前加上 @Transactional(rollbackFor=Exception.class)
2 让unchecked破例不回滚: @Transactional http://www.metabase.cn (notRollbackFor=RunTimeException.class)
3 不需求业务管理的(只查询的)办法:@Transactional(propagation=Propagation.NOT_SUPPORTED)
在整个办法运行前就不会敞开业务
还能够加上:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true),这样就做成一个只读业务,能够提高效率。
各种特点的含义:
REQUIRED:业务办法需求在一个容器里运行。假如办法运行时,现已处在一个业务中,那么加入到这个业务,否则自个新建一个新的业务。
NOT_SUPPORTED:声明办法不需求业务。假如办法没有相关到一个业务,容器不会为他敞开业务,假如办法在一个业务中被调用,该业务会被挂起,调用完毕后,原先的业务会康复履行。
REQUIRESNEW:不论是否存在业务,该办法总汇为自个建议一个新的业务。假如办法现已运行在一个业务中,则原有业务挂起,新的业务被创立。
MANDATORY:该办法只能在一个现已存在的业务中履行,业务办法不能建议自个的业务。假如在没有业务的环境下被调用,容器抛出破例。
SUPPORTS:该办法在某个业务规模内被调用,则办法变成该业务的一部分。假如办法在该业务规模外被调用,该办法就在没有业务的环境下履行。
NEVER:该办法绝对不能在业务规模内履行。假如在就抛破例。只有该办法没有相关就任何业务,才正常履行。
NESTED:假如一个活动的业务存在,则运行在一个嵌套的业务中。假如没有活动业务,则按REQUIRED特点履行。它使用了一个独自的业务,这个业务具有多个能够回滚的保留点。内部业务的回滚不会对外部业务形成影响。它只对DataSourceTransactionManager业务管理器起效。
业务圈套-1
清单 1. 使用 JDBC 的简略数据库刺进
view plaincopy to clipboardprint?
@Stateless
public class TradingServiceImpl implements TradingService {
@Resource SessionContext ctx; // http://www.metabase.cn
@Resource(mappedName="java:jdbc/tradingDS") DataSource ds;
public long insertTrade(TradeData trade) throws Exception {
Connection dbConnection = ds.getConnection();
try {
Statement sql = dbConnection.createStatement();
String stmt =
"INSERT INTO TRADE (ACCT_ID, SIDE, SYMBOL, SHARES, PRICE, STATE)"
+ "VALUES ("
+ trade.getAcct() + "‘,‘"
+ trade.getAction() + "‘,‘"
+ trade.getSymbol() + "‘,"
+ trade.getShares() + ","
+ trade.getPrice() + ",‘"
+ trade.getState() + "‘)";
sql.executeUpdate(stmt, Statement.RETURN_GENERATED_KEYS);
ResultSet rs = sql.getGeneratedKeys();
if (rs.next()) {
return rs.getBigDecimal(1).longValue();
} else {
throw new Exception("Trade Order Insert Failed");
}
} finally {
if (dbConnection != null) dbConnection.close();
}
}
}