1、事务的特征(ACID)
(1)原子性:不可分割性,操作要么全部执行,要么全部不执行。
(2)一致性:事务的执行使得数据库从一种正确的状态转换为另一种正确的状态。
(3)隔离性:一个事务的执行不能干扰其他事务。
(4)持久性:事务完成后,对数据的改变是永久性的,结果会永久的保存在数据库中。
Java事务产生的原因:程序操作sh数据可的需要,编程中,实现ACID的操作。
Java事务实现范围:通过JDBC间接实现对数据库的增删改查。
2、Java事务类型
JDBC事务:用Connection对象控制,包括手动模式和自动模式。局限在一个数据库连接内,使用简单。
JTA事务:与实现无关,与协议无关的API。可跨越多个数据库和多个DAO,使用复杂。
容器的事务:应用服务器提供,大多给予JTA完成,局限于EJB。
3、Spring事务核心接口:事务管理器、事务定义接口、事务状态接口。
4、事务定义接口:Spring事务属性范围:隔离规则、传播行为、回滚规则、事务超时、是否只读。
事务的读取类型:脏读、不可重复读、幻读。
脏读:事务没提交,提取读取。
不可重复读:两次读取到的数据不一致。
幻读:事务不是独立执行时,发生的一种非预期现象。
(1)事务的隔离级别:一个事务可能受其他事务影响的程度。
ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.。
ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。 这种隔离级别会产生脏读,不可重复读和幻像读。
ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据
ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。 它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。 除了防止脏读,不可重复读外,还避免了幻像读。
(2)事务的传播行为:一个事务被另一个事务方法调用时,必须知道事务如何传播。
PROPAGATION_REQUIRED:如果存在一个事务,支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS:如果存在一个事务,支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY:如果存在一个事务,支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行,如果当前没有说事务,则执行与PROPAGATION_REQUIRED类似的操作。
(3)事务是否只读:利用数据库的“只读”属性,进行特定优化处理。
(4)事务超时:特定时间内事务没有执行完毕,要进行回滚。
(5)事务回滚:遇到运行期异常时才会回滚。
5、事务状态:通过事务管理器获取事务状态,控制事务在回滚或提交时对应的zh状态。
6、spring事务实现的两种方式:编程式和声明式
(1)编程式事务实现方式
事务管理器方式:核心类为spring事务管理的三个接口及JDBCTemplate类。
模板事务的方式:主要工具为jdbcTemplate类。
(2)声明式事务管理
基于AOP的模式机制,通过对方法进行前后拦截。xml配置或注解方式实现。