没有合适的资源?快使用搜索试试~ 我知道了~
3.1平台事务管理器PlatformTransactionManager主要定义了各个不同的数据库平台的一些接口,针对不同的数据库平台进行事务管理org.spr
资源详情
资源评论
资源推荐
1.什么是事务?
事务是逻辑上的一组操作,这组操作要么全部成功,要么全部失败
2.事物具有四大特性 ACID
说到事务,就不得不说其 4 打特性,主要如下
原子性:(atomicity)
原子性指的是事务是一个不可分割的工作单位,事务中的操作要么全部发生,要么都不
发生
(就像物理中,原子是最小不可分割的单位)
一致性:(consistency)
一致性指的是事务前后数据的完整性必须保持一致(比如说,转账:张三账户有 2000
元,李四账户有 2000 元,一共 4000 元
张三项李四转账 2000 元后,一共还是 4000 元)
事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切
相关的
隔离性:(isolation)
隔离性指的是多个用户并发访问数据库是,一个用户的事务不能被其他用户的事务
干扰,多个并发事务之间相互隔离
持久性:(durability)。
持久性指的是一个事务一旦被提交,他对数据库中的数据的改变是永久的,即使数据库
故障
也不应该对其有任何影响
3.Spring 中事务的管理
Spring 中主要提供了以下 3 个接口来对事务进行管理
PlatformTransactionManager 平台事务管理器
主要用于事务的提交,回滚等说明
TransactionDefintion 事务定义信息(隔离,传播,超时,只读)
主要用于事务的隔离,传播,只读等说明
TransactionStatus 事务具体运行状态
是否是一个新的事务,是否有保存点,事务是否完成等说明
大致的运行过程:
首先通过 TransactionDefinition 定义了事务(隔离,传播,超时,只读)等信息后,
再交给 PlatformTransactionManager 平台事务管理器进行真正的事务管理,之后事
务会产生一些相应的状态,之后就会保存到 TransactionStatus 中。
3.1 平台事务管理器 PlatformTransactionManager
主要定义了各个不同的数据库平台的一些接口,针对不同的数据库平台进行事务管理
org.springframework.jdbc.datasource.DataSourceTransactionManager 使用
jdbc 或 Mybatis 进行持久化时使用
org.springframework.orm.hibernate3.HibernateTransactionManager 使用
Hibernate3.0 版本进行持久化数据时使用
org.springframework.orm.jdo.JdoTransactionManager 持久化机制为 jdao
org.springframework.orm.jpa.JpaTransactionManager 使用 jpa 进行持久化
org.springframework.transaction.jta.JtaTransactionManager 使用 JTA 来实现事
务管理,在一个事务跨越多个资源时必须使用
我们在使用不同的数据库时候,可以选择不同事务管理器,还有这里列举了一些常用的,
还有其他的可以参见 SpringApi 说明,也可以查看在线
api: http://tool.oschina.net/apidocs/#S
3.2 事务定义信息接口 TransactionDefintion
主要用于声明事务的传播行为,和隔离级别等信息
假如一个事务不去考虑其隔离性,可能会引发如下问题(脏读,不可重复读,幻读)
3.2.1 事务的脏读,不可重复读,幻读
脏读:一个事务读取到了一个事务 改写但是未提交的数据,如果这些数据回滚,则读
取到的数据是无效的
不可重复读:在同一个事物中,多次读取同一数据,由于另外一个事务对该数据 修改
提交,造成返回的结果不同。
幻读(虚读):一个事务读取几行记录后,另一个事务 插入或删除 了一些记录,导致
再次读取的返回结果不同。
不可重复读和幻读,很相似,只是侧重点不同:
相同点都是一个事务读取了另一个提交了的数据
不同点在于,不可重复读侧重点在于修改并提提交,幻读(虚度)在于删除或添加
可以参见博文:http://blog.csdn.net/v123411739/article/details/39298127
3.2.2 事务的隔离级别
为了解决上诉问题,Spring 在接口 TransactionDefintion 中定义了 4 中隔离级别,如
下:
DEFAULT 使用数据默认的隔离级别(由 spring 根据使用的数据库决定)
READ_UNCOMMITED 允许你读取还未提交的改变了的数据(可导致脏读,幻读,不
可重复读)
READ_COMMINTED 允许你读取事务已经提交后的数据(可防止脏读,但是幻读和不
可重复读是有可能发生的)
REPEATABLE_READ 对相同字段的多次读取是一致的,除非数据被事务本身改变(可防
止脏读,不可重复读,当幻读任然可能发生)
SERIALIZABLE 完全服从 ACID 的隔离级别,确保不发生脏读,幻读,不可重复读。这
在所有的隔离级别中是最慢的,他是典型的
通过完全锁定在事务中设计的数据表来完成的
提示:oracle 默认的是:READ_COMMINTED mysql 默认是:REPEATABLE_READ,
前边的 3 个是我们经常需要使用的
3.2.3 事务的传播行为
一般我们的事务是在业务层中(Service)中使用的,假如遇到比较复杂的业务,需要
在一个业务中调用另一个业务的方法:
如下:
业务逻辑 ServiceA 中的方法 methoda()中的需要与业务逻辑 ServiceB 中的方法
methodb()方法共同完成某个复杂的逻辑
假如都有事务,到底是使用谁的事务。
事务的传播行为,正是为了解决业务层中的方法相互调用的问题 的。
[java] view plain copy
1. ServiceA{
2. methoda(){//需要调用 serviceB 中的业务方法 methodb()共同完成
3. dao1.xxmethod();
4. serviceB.methodb();
5.
6. }
7. }
8.
9. ServiceB{
10. methodb(){
11. dao2.yymethod();
12. }
13. }
14.
15. DAO1{
16. xxmethod(){
17.
18. }
19. }
20.
21. DAO2{
22. yymethod(){
23.
24. }
25.
26. }
Spring 的事务定义信息接口 TransactionDefintion 还定义了如下 7 中事务传播行为
常量,我们可以分为 3 类,(同一事物中,不同事务中,嵌套事务中)
剩余25页未读,继续阅读
东方捕
- 粉丝: 16
- 资源: 310
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0