事务是指逻辑上的一组操作,这组操作要么全部成功,要么全部失败。
①原子性:指事务的操作要么全部都发生,要么都不发生。 ②一致性:指事务执行前后数据的完整性必须保持一致。 ③隔离性:指多个事务并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要相互隔离(可以通过设置事务的隔离级别解决,后续会讲到)。 ④持久性:指一个事务一旦被提交,它对数据库中的数据的改变是永久性的,即使数据库发生故障也不应该对其有任何影响。
Spring事务管理器高层抽象接口主要有3个接口 ①PlatformTransactionManager(平台事务管理器):主要是进行事务的提交回滚等功能。 ②TransactionDefinition(事务定义信息):主要包含事务的隔离级别、传播行为、是否超时等。 ③TransactionStatus(事务具体运行状态):包括事务是否已提交、是否是新创建的事务、是否有保存点等。
根据不同的持久化框架提供了不同的PlatformTransactionManager接口实现: ①使用Spring JDBC或iBatis: org.springframework.jdbc.datasource.DataSourceTransactionManager ②使用Hibernate3.0版本: org.springframework.orm.hibernate3.0.HibernateTransactionManager
若不考虑事务的隔离性,会引发安全问题如下: ①脏读:一个事务读取了另一个事务改写但还未提交的数据,如果这些数据被回滚,则读到的数据是无效的。 ②不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同。 ③幻读:一个事务读取了几行记录后,另一个事务插入了一些记录,在后来的查询中第一个事务就会发现有些原来没有的记录。
事务的隔离级别就是用来解决以上三种安全问题的,隔离级别从低到高有四种: ①read_uncommited:允许你读取还未提交的改变了的数据。可能会导致脏读、不可重复读、幻读。 ②read_commited:允许在并发事务已提交后读。可防止脏读,但不可重复读、幻读仍可能发生。 ③repeatable_read:可防止脏读、不可重复读,但幻读仍可能发生。 ④serializable:完全服从ACID的隔离级别,但是速度是最慢的。 还有就是默认的default,它与你后端使用的数据库默认隔离级别一致,比如使用MySQL默认就是repeatable_read,使用Oracle默认就是read_commited。
事务的传播行为主要解决的是业务层方法之间相互调用时产生的事务应该如何进行传递的问题。比如我要调用service1中的a()和service2中的b()才能完成一个业务这种情况。 ①propagation_required ②propagation_supports ③propagation_mandatory ④propagation_requires_new ⑤propagation_not_supported ⑥propagation_never ⑦propagation_nested (详细的后续再进行添加)
这里就简单列举几个常用到的方法: boolean hasSavePoint()//事务是否有保存点; boolean isCompleted()//事务是否已经完成了; boolean isNewTransaction()//是不是一个新的事务。