什么是事务
事务是正确执行一系列的操作(或动作) , 使得数据库从一种状态转换成另一种状态,且保证操作全部成功,或者全部失败。
事务原则是什么
事务必须服从ISO/IEC所制定的ACID原则。
ACID原则的具体内涵如下:
原子性( Atomicity ) :
即不可分割性,事务要么全部被执行,要么就全部不被执行。
一致性( Consistency ) :
事务的执行使得数据库从一种正确状态转换成另一种正确状态。
隔离性( Isolation ) :
在事务正确提交之前,它可能的结果不应显示给任何其他事务。
持久性( Durability ) :
事务正确提交后,其结果将永久保存在数据库中。
Java事务
Java事务的产生
程序操作数据库的需要。在Java编写的程序或系统中,实现ACID的操作。
Java事务实现范围
通过JDBC相应方法间接来实现对数据库的增、删、改、查,把事务转移到Java程序代码中进行控制。
Java事务实现模式
Java事务的实现
通过Java代码来实现对数据库的事务性操作。
Java事务类型
JDBC事务:用Connection对象控制,包括手动模式和自动模式。
JTA(Java Transaction API)事务:与实现无关的,与协议无关的API。
容器事务:应用服务器提供的,且大多是基于JTA完成(通常基于JNDI的,相当复杂的API实现)。
三种事务的差异
JDBC事务:控制的局限性在一一个数据库连接内,但是其使用简单。
JTA事务:功能强大,可跨越多个数据库或多DAO ,使用比较复杂。
容器事务:主要指的是J2EE应用服务器提供的事务管理,局限于EJB
数据读取类型说明
脏读:
事务没提交,提前读取。
不可重复读:
两次读取的数据不一致;
幻读:
事务不是独立执行时发生的一种非预期现象。
事务隔离级别
隔离级别定义了一个事务可能受其他并发事务影响的程度。
隔离级别分为:
事务传播行为
当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。
在Spring的提供了7种传播行为:
事务是否只读
事务是否只读
利用数据库事务的“只读”属性,进行特定优化处理。
设置“只读” 注意:
事务的是否“只读”属性,不同的数据库厂商支持不同。
通常而言:只读属性的应用要参考厂商的具体支持说明,比如:
Oracle的"readOnly"不起作用,不影响其增删改查;
Mysql的"readOnly"为true ,只能查,增删改则出异常。
事务超时
事务超时
事务超时就是事务的一个定时器,在特定时间内事务如果没有执行完毕,那么就会自动回滚,而不是一直等待其结束。
设计事务时注意点:
为了使应用程序很好地运行,事务不能运行太长的时间。因为事务可能涉及对后端数据库的锁定,所以长时间的事务会不必要的占用数据库资源。
事务回滚
事务回滚
默认情况下,事务只有遇到运行期异常时才会回滚,而在遇到检查型异常时不会回滚。
自定义回滚策略:
声明事务在遇到特定的检查型异常时像遇到运行期异常那样回滚。
声明事务遇到特定的异常不回滚,即使这些异常是运行期异常。
Spring事务状态
事务接口
通过事务管理器获取TransactionStatus实例。
控制事务在回滚或提交的时候需要应用对应的事务状态。
Spring事务接口: