- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我对 Spring 事务管理感到困惑。在我的应用程序中,我在服务类中使用 @Transactional 实现了事务管理。我配置的 spring.xml 如下:
${jdbc.dialect}
false
update
如果我在配置文件中实现事务管理,如下所示,而不在服务类中使用@Transactional:
expression="execution(* x.y.service.*Service.*(..))"/>
expression="execution(* x.y.service.ddl.DefaultDdlManager.*(..))"/>
与 @Transactional 相比,它能给我带来什么好处吗?有人告诉我使用@Transactional也是Spring AOP的实现。谁能解释一下怎么做?
1 Câu trả lời
不会的。
好处
如果您不需要一些非常具体的要求或者您没有性能问题,那么您不应该重新发明轮子。 Spring是一个近乎完美的设计、测试和磨砺的工具,甚至可以替代企业应用服务器。 @Giao dịch
是管理事务的声明式方式,它比任何 aop xml 配置更加方便和可读。它的好处包括以声明方式自动处理所有事务管理方面:隔离和传播级别(控制嵌套事务并不容易)、超时、回滚条件以及服务类的每个方法的不同 TransactionManager。易于阅读、易于配置、易于使用。
@Transactional(readOnly = false, rollbackFor = ServiceException.class, isolation = Isolation.READ_COMMITTED)
public void myServiceJob(...)
当你看到这个方法时,很容易理解它的事务属性(无需在方法中提供事务实现细节)。如果是普通的AOP,每次你想知道这个方法发生了什么,你应该检查你的xml配置并找到相应的方法,这样就不太优雅了。
另一方面,调试或使用这些代理进行任何其他声明性管理非常困难。例如。从上下文中提取 bean 并使用反射从包装的 bean 中获取某些内容(比如说,出于监视目的)是很棘手的(但并非不可能)。另外,当bean调用它的某个方法时,它不会被委托(delegate)给proxy,因为你的bean对proxy一无所知,所以cái này
指的是bean本身。解决这个问题的唯一方法是提供“self”字段并将其设置在自定义 bean 后处理器中(但您的实现也会受到此影响)。
hoàn thành
如果 Spring 配置为使用事务管理,它会在 bean 定义上查找 @Transactional 注释并创建自动生成的 AOP 代理,该代理是 bean 的子类。 Spring代理的默认行为只是将方法的调用委托(delegate)给底层bean。然后 Spring 注入(inject) TransactionInterceptor 和必要的 TransactionManager。拦截器的代码看起来很简单:
public Object invoke(final MethodInvocation invocation) throws Throwable {
// Work out the target class: may be {@code null}.
// The TransactionAttributeSource should be passed the target class
// as well as the method, which may be from an interface.
Class> targetClass = (invocation.getThis() != null ? AopUtils.getTargetClass(invocation.getThis()) : null);
// Adapt to TransactionAspectSupport's invokeWithinTransaction...
return invokeWithinTransaction(invocation.getMethod(), targetClass, new InvocationCallback() {
@Ghi đè
public Object proceedWithInvocation() throws Throwable {
return invocation.proceed();
}
});
}
hiện hữu invokeWithinTransaction
内部,TransactionInterceptor 确定调用是应该在调用者事务范围内(如果存在)还是在新事务范围内(与传播级别有关)。然后选择相应的TransactionManager,配置超时和隔离级别,然后调用该方法。在决定是否应该提交或回滚事务之后(根据捕获的异常和时间进行选择)。
关于java - Spring事务管理: using @Transactional vs using AOP (
我正在使用 PostgREST 将数据库实体暴露给使用这些实体的 Springboot 应用。 我的数据库中有两个实体,分别是 Person 和 City。 我想同时保存 Person 实体和 Cit
1、事务的定义 Redis的事务提供了一种“将多个命令打包, 然后一次性、按顺序地执行”的机制。 redis事务的主要作用就是串联多个命令防止别的命令插队。 但是,事务并不具有传统
SQLite 事务(Transaction) 事务(Transaction)是一个对数据库执行工作单元。事务(Transaction)是以逻辑顺序完成的工作单位或序列,可以是由用户手动操作完成,也可
事务是顺序组操作。 它们作为单个单元运行,并且直到组中的所有操作都成功执行时才终止。 组中的单个故障会导致整个事务失败,并导致对数据库没有影响。 事务符合ACID(原子性,一致性,隔离和耐久性)
我希望将 SqlKata 用于一个项目。但是,项目标准的一部分是查询应该能够作为事务执行。有没有一种方法可以使用 MSSQL 事务执行一个查询或多个查询? 非常感谢。 最佳答案 SQLKata 使用
我只是以多线程方式测试 PetaPoco 事务... 我有一个简单的测试用例: -- 简单的值对象称之为 MediaDevice -- 插入一条记录,更新1000次 void TransactionT
我正在尝试从 Excel VBA 向 SQL 中插入一些数据。 SQL 命令是在 VBA 脚本的过程中构建的,包括使用一些 SQL 变量。 我试图了解事务在 VBA 中是如何工作的,以及它们是否可以处
情况如下: 一个大型生产客户端/服务器系统,其中一个中央数据库表具有某个列,该列的默认值是 NULL,但现在默认值是 0。但是在该更改之前创建的所有行当然仍然具有 null 值,这会在该系统中生成许多
数据库事务是一个熟悉的概念。 try { ... .. updateDB() .. ... commit(); } catch error { rollback(); }
我想了解使用传播支持进行 Spring 交易的用途。 java 文档提到如果具有 @Transactional(propagation = Propagation.SUPPORTS) 的方法从支持该事
我需要获取 hibernate 的事务 ID。对于每笔交易,此 ID 必须是唯一的。我尝试使用 session.getTransaction().hashCode(),但我相信这个值不是唯一的。 最佳
我从 firebase 收到以下消息:runTransactionBlock:启用持久性时检测到的使用情况。请注意,事务不会在应用重新启动后保留。 那么应用程序重新启动后到底会发生什么?由于主数据库的
我需要在 jdbc 中执行选择、更新、插入查询的序列。 这是我的代码: public String editRequest(){ connection = DatabaseUtil.getServi
Java 是否提供了一种智能“聚合”事务的方法?如果我有多个异构数据存储库,我想保持同步(即用于数据的 Postgres、用于图表的 Neo4j 以及用于索引的 Lucene),是否有一个范例仅允许
Tôi có một vài câu hỏi về chủ đề trong tiêu đề. Đầu tiên, giả sử chúng ta sử dụng JDBC và có 2 giao dịch T1 và T2. Trong T1, chúng ta thực hiện câu lệnh select trên một hàng cụ thể. Sau đó chúng tôi thực hiện cập nhật trên hàng đó. Trong giao dịch T2, chúng tôi
我有一个 Python CGI 处理支付交易。当用户提交表单时,CGI 被调用。提交后,CGI 需要一段时间才能执行信用卡交易。在此期间,用户可能会按下 ESC 或刷新按钮。这样做不会“杀死”CGI,
我有一个代码,类似这样 def many_objects_saving(list_of_objects): for some_object in list_of_objects:
我有一个包含 100,000 条记录的表。我正在考虑使用事务来更新数据。将有一个查询将一列更新为零,并且大约有 5000 个更新,每个更新将更新一条记录。 这些大型事务对内存有何影响?事务运行时选择数
有没有办法在一个命令中执行 SQL 事务?例如 mysql_query(" START TRANSACTION; INSERT INTO table1 ....etc; INSERT INTO tab
真心希望能帮到你! 我使用以下函数在 PHP/MySql 应用程序中发送消息: public function sendMail($sender_id, $recipient_id, $subject
Tôi là một lập trình viên xuất sắc, rất giỏi!