数据库事务

标签: 数据库 | 发表时间:2014-04-21 19:05 | 作者:leichenlei
出处:http://www.iteye.com

一、事务传播:

 

 

事务传播发生在类似以下情形:

 

class ServiceA {
	//事务1
	void methodA(){
		new ServiceB().methodB();
	}
}


class ServiceB {
	//事务2
	void methodB(){
		
	}
}

 

 

假设methodB的配置是:

 

1: PROPAGATION_REQUIRED 

如果methodA在事务里,那么methodB也在这个事务中运行。

如果methodA不在事务里,那么methodB重新建立一个事务运行。

 

 

2: PROPAGATION_SUPPORTS 

如果methodA在事务里,那么methodB也在这个事务中运行。

如果methodA不在是事务里,那么methodB在非事务中运行。

 

 

3: PROPAGATION_MANDATORY 

如果methodA在一个事务里,那么methodB也在这个事务中运行。

如果methodA不在一个是事务里,那么methodB抛出异常。

 

 

4: PROPAGATION_REQUIRES_NEW 

不管methodA在不在事务里,methodB都重新建立一个事务运行。

methodB事务运行时,methodA事务挂起;methodB事务结束后,methodA事务继续。

 

 

5: PROPAGATION_NOT_SUPPORTED 

不管methodA在不在事务里,methodB都在非事务中运行。

methodB以非事务运行,methodA事务挂起;methodB运行完,methodA事务继续。

 

 

6: PROPAGATION_NEVER 

如果methodA在一个事务里,那么methodB抛出异常。

 

 

7: PROPAGATION_NESTED 

methodB的事务是methodA事务的内嵌事务。

methodB失败回滚到它执行前的 SavePoint,methodA加以处理methodB异常

1. 我们要设置 transactionManager 的 nestedTransactionAllowed 属性为 true。 

2. java.sql.Savepoint 必须存在, 即 jdk 版本要 1.4+ 

3. Connection.getMetaData().supportsSavepoints() 必须为 true, 即 jdbc drive 必须支持 JDBC 3.0 

 

 

 

参考:

http://www.blogjava.net/freeman1984/archive/2010/04/28/319595.html

http://www.iteye.com/topic/35907

 

 

 

 

二、事务隔离

 

1、Serializable:最严格的级别,事务串行执行,资源消耗最大; 

2、REPEATABLE READ:保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但是带来了更多的性能损失。 

3、READ COMMITTED:大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”。该级别适用于大多数系统。 

4、Read Uncommitted:保证了读取过程中不会读取到非法数据。隔离级别在于处理多事务的并发问题。

 

 

1: Dirty reads--脏读。

比如事务A的未提交(还依然缓存)的数据被事务B读走,如果事务A失败回滚,会导致事务B所读取的的数据是错误的。 

2: non-repeatable reads--不可重复读。

比如事务A中两处读取数据-total-的值。在第一读的时候,total是100,然后事务B就把total的数据改成200,事务A再读一次,结果就发现,total竟然就变成200了,造成事务A数据混乱。 

3: phantom reads--幻读。

数据集改变。比如Select account.id where account.name="ppgogo*",第一次读去了6个符合条件的id,第二次读取的时候,由于事务b把一个帐号的名字由"dd"改成"ppgogo1",结果取出来了7个数据。

 

 

  脏读 不可重复读 幻读
Serializable 不会 不会 不会
Repeatable Read 不会 不会
Read Committed 不会
Read Uncommitted

 

 

参考:

http://blog.csdn.net/sunandice/article/details/7697278

http://bbs.csdn.net/topics/120024254



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [数据库] 推荐:

数据库sharding

- - 数据库 - ITeye博客
当团队决定自行实现sharding的时候,DAO层可能是嵌入sharding逻辑的首选位置,因为在这个层面上,每一个DAO的方法都明确地知道需要访问的数据表以及查询参数,借助这些信息可以直接定位到目标shard上,而不必像框架那样需要对SQL进行解析然后再依据配置的规则进行路由. 另一个优势是不会受ORM框架的制约.

数据库索引

- - CSDN博客推荐文章
索引是由用户创建的、能够被修改和删除的、实际存储于数据库中的物理存在;创建索引的目的是使用户能够从整体内容直接查找到某个特定部分的内容. 一般来说,索引能够提高查询,但是会增加额外的空间消耗,并且降低删除、插入和修改速度. 1.聚集索引:表数据按照索引的顺序来存储的. 2.非聚集索引:表数据存储顺序与索引顺序无关.

数据库事务

- - 数据库 - ITeye博客
事务传播发生在类似以下情形:. 假设methodB的配置是:. 如果methodA在事务里,那么methodB也在这个事务中运行. 如果methodA不在事务里,那么methodB重新建立一个事务运行. 如果methodA在事务里,那么methodB也在这个事务中运行. 如果methodA不在是事务里,那么methodB在非事务中运行.

数据库优化

- - 数据库 - ITeye博客
程序运行效率,优化应用程序,在SP编写过程中应该注意以下几点: . a) SQL的使用规范: .   i.尽量避免大事务操作,慎用holdlock子句,提高系统并发能力.   ii.尽量避免反复访问同一张或几张表,尤其是数据量较大的表,可以考虑先根据条件提取数据到临时表中,然后再做连接.   iii.尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该改写;如果使用了游标,就要尽量避免在游标循环中再进行表连接的操作.

数据库调优

- - 数据库 - ITeye博客
1、1、调整数据结构的设计. 这一部分在开发信息系统之前完成,程序员需要考虑是否使用ORACLE数据库的分区功能,对于经常访问的数据库表是否需要建立索引等. 这一部分也是在开发信息系统之前完成,程序员在这一步需要考虑应用程序使用什么样的体系结构,是使用传统的Client/Server两层体系结构,还是使用Browser/Web/Database的三层体系结构.

MySQL数据库的修复

- Xin - 博客园-首页原创精华区
找到mysql的安装目录的bin/myisamchk工具,在命令行中输入:. 然后myisamchk 工具会帮助你恢复数据表的索引. 好象也不用重新启动mysql,问题就解决了. 当你试图修复一个被破坏的表的问题时,有三种修复类型. 如果你得到一个错误信息指出一个临时文件不能建立,删除信息所指出的文件并再试一次--这通常是上一次修复操作遗留下来的.

Oracle 发布 NoSQL 数据库

- 冷月 - 博客园新闻频道
  Oracle 作为全球最大的关系型数据库提供商,在其产品链条中,也加入了 NoSQL 数据库这一环,而且这个新的数据库名字很霸气,就叫 NoSQL Database,想起了当年新浪微博更换 weibo.com 域名之时的一个笑话:. 原来有三家人做面包,张三家的面包叫三张牌面包,李四家的牌子叫李四牌面包,王五家出品的是王五牌面包,而突然有一天,张三家的面包改名了,叫面包牌面包.

WineHQ 数据库泄漏

- gnawux - LinuxTOY
运行于 *Nix 之上的开源跨平台 Win32 API 兼容层 WineHQ 的 AppDB 和 Bugzilla 数据库被黑客攻击. CodeWeavers CEO Jeremy 在信中提到黑客利用某种方式获取了 WineHQ 的 AppDB 和 Bugzilla 的访问,并且下载了完整数据库文件.

数据库复制-Goldengate

- - 人月神话的BLOG
参考: http://wenku.baidu.com/view/4fd7ea22bcd126fff7050b5d.html. GoldenGate TDM(交易数据管理)软件是一种基于日志的结构化数据复制软件,它通过解析源数据库在线日志或归档日志获得数据的增删改变化,再将这些变化应用到目标数据库,实现源数据库与目标数据库同步、双活.