何为事务
事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
简单来说就是一组通过程序操作数据库的操作,要么全部成功,要么全部失败。
事务的ACID四大特性:
原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。
一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。
隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。
Spring事务管理的三个高层接口:
1,PlatformTransactionManager 平台相关事务管理器
TransactionManager是整个spring事务管理核心对象,提供管理事务相关方法
项目开发时,使用不同持久层技术,就需要使用spring提供不同事务管理器
JDBC编程 --- 通过Connection进行事务管理
开启事务 conn.setAutoCommit(false);
提交事务 conn.commit();
回滚事务 conn.rollback();、 conn.rollback(SavePoint );
Spring 提供 DataSourceTransactionManager 针对Connection进行事务管理
Spring 提供 HibernateTransactionManager 针对 session进行事务管理
2,TransactionDefinition 事务定义信息 (在使用spring管理事务,对事务管理配置信息 )
TransactionDefinition 主要指 spring管理事务过程中,配置如何对事务进行管理
(隔离级别、传播行为、超时时间、 是否只读)
get Name 获取事务名称 getIsolationLevel 获取事务隔离级别
脏读:一个事务读取另一个事务 未提交的数据 ---- 非常严重安全问题
不可重复读:一个事务读取另一个事务已经提交数据,先后读取两次,结果不一样(另一个事务进行update操作)
幻读:一个事务中先后读取两次,发现数据记录条数不一样(另一个事务进行insert操作 )
数据库为了解决 隔离性引发几种问题,提供四种隔离级别
read uncommitted 引发所有隔离问题、
read committed 阻止脏读发生、发生不可重复读和幻读、
repeatable read 阻止脏读、不可重复读发生,可能发生幻读、
serializable 阻止所有隔离问题
不是所有数据库都支持四种隔离级别, oracle只支持 read committed、serializable ; mysql支持所有隔离级别
DEFAULT 代表默认数据库隔离级别,oracle 默认级别 read committed、 mysql 默认级别 repeatable read
getPropagationBehavior 获取事务的传播行为
什么是传播行为?
和隔离级别不同,不是数据库提供问题解决方案,而是spring针对实际开发中具体事务问题,引入事务解决方案,解决两个事务互相调用的问题 !
Spring为了解决上面的问题,提供七种传播行为
REQUIRES_NEW、NOT_SUPPORTED、NEVER:不支持当前事务 (ATM取钱、打印凭条) 操作不同事务
NESTED 嵌套事务,只对DataSourceTransactionManager 有效,底层原理SavePoint 一个事务,允许回滚到事务中的某个保存的点,然后继续执行
3,TransactionStatus 事务运行状态
指事务运行过程中,某个时间点事务状态信息
用户想使用spring进行事务管理 ,对事务管理进行配置(TransactionDefinition),选用针对持久层技术事务管理器 TransactionManager, TransactionManager根据TransactionDefinition 进行事务管理,在事务管理过程中通过 TransactionStatus获取当时事务状态 。
Spring事务管理的两种方式:
在spring配置TransactionManager ,将transactionManager对象注入到 TransactionTemplate 对象中,将transactionTemplate 注入到目标程序中
transactionTemplate.execute(new TransactionCallbackWithoutResult(){ doInTransaction(){ // 将需要事务管理代码,加在这里 } });
如果方法没有异常,事务提交,如果方法发生异常,事务回滚
2、 声明式事务管理,底层使用AOP的环绕通知,没有任何代码侵入,现在开发中推荐使用 。
-----------------------------------------------------------下一篇写简单案例