PSZxdW90OyB0cmFkaW5nU2VydmljZSBUYXJnZXQmcXVvdDsvJmd0OyZsdDsvcHJvcGVydHkmZ3Q7PGJyPgombHQ7cHJvcGVydHkgbmFtZT0mcXVvdDt0cmFuc2FjdGlvbkF0dHJpYnV0ZXMmcXVvdDsmZ3Q7PGJyPgombHQ7cHJvcHMmZ3Q7PGJyPgombHQ7cHJvcCBrZXk9obBpbnNlcnQqJnF1b3Q7Jmd0O1BST1BBR0FUSU9OX1JFUVVJUkVELElTT0xBVElPTl9TRVJJQUxJWkFCTEUmbHQ7L3Byb3AmZ3Q7PGJyPgombHQ7L3Byb3BzJmd0Ozxicj4KJmx0Oy9wcm9wZXJ0eSZndDs8YnI+CiZsdDsvYmVhbiZndDs8YnI+Cjxicj4KPGJyPgo8aDI+wfmhosrCzvHA4NDNPC9oMj4Ksb612MrCzvHEo9DNo7pMb2NhbCBUcmFuc2FjdGlvbiBNb2RlbDxicj4Ks8zQ8rao1sbKws7xxKPQzaO6UHJvZ3JhbW1hdGljIFRyYW5zYWN0aW9uIE1vZGVsPGJyPgrJ6sP3yr3Kws7xxKPQzaO6RGVjbGFyYXRpdmUgVHJhbnNhY3Rpb24gTW9kZWw8YnI+CjxoMj7G36Git9ayvMq9ysLO8TwvaDI+CrbguPbK/b7d1LQ8YnI+CsG9ts7M4b270K3S6Txicj4KtdrSu7K9o6zKws7xv9jWxsb30a/Oyrj318rUtLncwO3G98rHt/HXvLG4usPM4b27Ozxicj4Ktdq2/rK9o6zI57n7y/nT0NfK1LS53MDtxve2vNe8sbi6w8zhvbujrNTyysLO8bncwO3G99Kqx/PL+dPQvfjQ0Mzhvbuhozxicj4KPGltZyBzcmM9"https://www.cppentry.com/upload_files/article/57/1_iy2m5__.jpg" alt="\">
Spring事务处理
1.声明式事务管理
2.编程式事务管理
Spring声明式事务不提供高端应用服务器提供的跨越远程调用的事务上下文传播。如果你需要这些特性,我们推荐你使用EJB。 然而,不要轻易使用这些特性。因为通常我们并不希望事务跨越远程调用。
Spring中事务处理-申明式事务管理
事务属性
PROPAGATION_REQUIRED
PROPAGATION_SUPPORTS
PROPAGATION_MANDATORY
PROPAGATION_REQUIRES_NEW
PROPAGATION_NOT_SUPPORTED
PROPAGATION_NEVER
PROPAGATION_NESTED如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行。嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚
Isolation隔离级别
read-only是否只读,默认为false
大多数Spring用户选择声明式事务管理。这是对应用代码影响最小的选择,因此也最符合 非侵入式 轻量级容器的理念。
java
// the service class that we want to make transactional
@Transactional
public class DefaultFooService implements FooService {
Foo getFoo(String fooName);
Foo getFoo(String fooName, String barName);
void insertFoo(Foo foo);
void updateFoo(Foo foo);
}
xml
Spring中事务处理-编程式事务管理
使用 TransactionTemplate (推荐)
直接使用一个 PlatformTransactionManager 实现
使用 TransactionTemplate
private final TransactionTemplate transactionTemplate;
// use constructor-injection to supply the PlatformTransactionManager
public SimpleService(PlatformTransactionManager transactionManager) { Assert.notNull(transactionManager, "The "transactionManager' argument must not be null.");
this.transactionTemplate = new TransactionTemplate(transactionManager);
// the transaction settings can be set here explicitly if so desired this.transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_UNCOMMITTED); //设定事务隔离级别
this.transactionTemplate.setTimeout(30); // 事务超时
}
…
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
try {
updateOperation1();
updateOperation2();
} catch (SomeBusinessExeption ex) {
status.setRollbackOnly(); //回滚
}
}
});
使用 PlatformTransactionManager
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
// explicitly setting the transaction name is something that can only be done programmatically
def.setName("SomeTxName"); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = txManager.getTransaction(def);
try {
// execu |