在Spring中,事务可以失效的几个常见场景包括:
1. 方法没有被声明为`@Transactional`:在Spring中,只有被`@Transactional`注解标记的方法才会启用事务管理。如果一个方法没有被声明为`@Transactional`,那么其中的数据库操作将不会受到事务管理的影响,可能会导致事务失效。
2. 异常没有被正确抛出:在默认情况下,Spring的事务管理器只会在遇到未捕获的RuntimeException或Error时回滚事务。如果在事务中捕获了异常并没有重新抛出,或者捕获的异常是被检查异常(Checked Exception),那么事务可能不会回滚。
3. 事务传播行为设置不正确:Spring事务的传播行为定义了事务方法与其他事务方法的关系。如果在调用事务方法时,传播行为设置不正确,可能会导致事务失效。例如,如果一个事务方法A调用了另一个事务方法B,而B的传播行为设置为`Propagation.REQUIRES_NEW`,那么B将会在一个新的事务中执行,而不是使用A的事务。
4. 异步方法:在Spring中,异步方法默认是不受事务管理的。如果在异步方法中进行数据库操作,并且没有手动开启事务,那么事务将不会生效。
5. 类自我调用:当一个类的方法在同一个类中被调用时,Spring的事务代理机制可能会失效。这是因为Spring的事务代理是通过AOP实现的,而AOP是基于动态代理的。当一个方法在同一个类中被调用时,动态代理无法拦截到方法调用,从而导致事务失效。
这些是一些常见的导致Spring事务失效的场景,需要注意并避免在实际的开发中。为了确保事务的正确应用,建议仔细阅读Spring事务管理的文档,并正确配置和使用`@Transactional`注解。
使用DDL是无法回滚
DDL(Data Definition Language,数据定义语言)用于定义数据库对象的结构,例如表、视图、索引等。以下是一些常见的DDL命令:
-
CREATE:用于创建数据库对象,例如创建表、视图、索引等。
CREATE TABLE
: 创建表。CREATE VIEW
: 创建视图。CREATE INDEX
: 创建索引。CREATE TRIGGER
: 创建触发器。
-
ALTER:用于修改数据库对象的结构。
ALTER TABLE
: 修改表的结构,例如添加列、修改列类型、添加约束等。ALTER VIEW
: 修改视图的定义。ALTER INDEX
: 修改索引的定义。ALTER TRIGGER
: 修改触发器的定义。
-
DROP:用于删除数据库对象。
DROP TABLE
: 删除表。DROP VIEW
: 删除视图。DROP INDEX
: 删除索引。DROP TRIGGER
: 删除触发器。
-
TRUNCATE TABLE:用于快速删除表中的所有数据,并且不能回滚。
-
RENAME:用于重命名数据库对象。
RENAME TABLE
: 重命名表。RENAME COLUMN
: 重命名列。
多线程在事务中操作
事务中前面有删除操作,后面的插入禁止使用多线程(并且后面使用了join,就会是串行,所以或报错)跑插入或更新操作,同一个事务中同一个线程可以共享事务,新开的线程就不行,因为删除操作会锁住整个表,后面其他线程无法插入或更新