??xml version="1.0" encoding="utf-8" standalone="yes"?>
事务是应用程序中一pd严密的操作,所有操作必L功完成,否则在每个操作中所作的所有更攚w会被撤消。也是事务h原子性,一个事务中的一pd的操作要么全部成功,要么一个都不做?/span>
事务的结束有两种Q当事务中的所以步骤全部成功执行时Q事务提交。如果其中一个步骤失败,发生回滚操作,撤消撤消之前C务开始时的所以操作?/span>
二.事务?/span>
ACID
事务h四个特征Q原子性( Atomicity Q、一致性( Consistency Q、隔L( Isolation Q和持箋性( Durability Q。这四个Ҏ简UCؓ ACID Ҏ?/span>
1 、原子?/span>
事务是数据库的逻辑工作单位Q事务中包含的各操作要么都做Q要么都不做
2 、一致?/span>
事务执行的结果必L使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时Q就说数据库处于一致性状态。如果数据库pȝq行中发生故障,有些事务未完成pq中断,q些未完成事务对数据库所做的修改有一部分已写入物理数据库Q这时数据库处于一U不正确的状态,或者说是不一致的状态?/span>
3 、隔L?/span>
一个事务的执行不能其它事务q扰。即一个事务内部的操作及用的数据对其它ƈ发事务是隔离的,q发执行的各个事务之间不能互相干扰?/span>
4 、持l?/span>
也称怹性,指一个事务一旦提交,它对数据库中的数据的改变应该是怹性的。接下来的其它操作或故障不应该对其执行结果有M影响?/span>
二.事务的属?/span>
一个事务的属性控制了事务的用范围?/span> EJB ?/span> Spring 以及.net下的事务属性都很类似的Q?/span> 事务属性有如下几种Q?/span>
Required:
如果在一个事务中调用Q就把该Ҏ加到此事务中?/span>
如果q没有启动事务,启动一个新事务
RequiredNew:
不管当前有没有事务,都会启动一个新事务Q如果当前有事务Q会被挂L到方法结束?/span>
NotSupported:
不能在事务中执行此方法。如果有事务Q将会被挂v直到Ҏl束?/span>
Supports:
如果当前有事务,此方法会加到当前事务Q如果没有,容器也不会启动新事务?/span>
Mandatory:
必须在事务中调用此方法,否则抛出异常?br />
Never:
必须不在事务中调用此ҎQ否则抛出异常?/span>
三.事务的回?/span>
CMT 在以下两中情况下Q事务将回滚。第一Q如果生一个系l异常,容器自动回滚该事务。第二,通过调用 EJBContext 接口 SetRollbackOnly ҎQ?/span> Bean Ҏ通知容器回滚该事务。如?/span> Bean 抛出一个应用异常,事务不会自动回滚,但可以调?/span> SetRollbackOnly 回滚?/span>
四.事务时
对于 EJB 中的容器理事务Q事务超旉隔是通过讄 default.properties 文g?/span> ransaction.timeout 属性的值来定的,该文件在 J2EE SDK 安装目录?/span> config 子目录下。如下例事务超旉隔设|ؓ 5 U钟Q?/span> transaction.timeout=5 Q这P当事务在 5 U钟内还没有完成Q容器将回滚该事务?/span>
J2EE SDK 安装后,时间隔的缺省gؓ 0 Q表CZ计算时Q无Z务执行多长时_除非异常出错回滚Q一直等待事务完成?/span>
只有使用容器理事务的企?/span> Bean 才会受到 transaction.timeout 属性值的影响?/span> Bean 理?/span> JTA 事务使用 UserTransaction 接口?/span> setTransactionTimeout Ҏ来设|事务超旉隔?/span>
五.隔离U别
事务不仅保证事务界限内的数据库操作全部完成(或回滚)同时q隔L据库更新语句。隔ȝ别描q被修改的数据对其他事物的可见度。隔ȝ别的控制会跟具体?/span> DBMS 厂商不同而不同?/span>
隔离U别与ƈ发性是互ؓ矛盾的:隔离E度高Q数据库的ƈ发性越差;隔离E度低Q数据库的ƈ发性越好?/span>
通过一些现象,可以反映出隔ȝ别的效果。这些现象有Q?/span>
l 更新丢失Q?/span> lost update Q:当系l允怸个事务同时更新同一数据是,发生更新丢失?/span>
l 脏读Q?/span> dirty read Q:当一个事务读取另一个事务尚未提交的修改Ӟ产生脏读?/span>
l 非重复读Q?/span> nonrepeatable read Q:事务多次d同一行中的数?/strong>却得C同数值时。例如:事务1d了一行数据,而事?改变或删除了那些行ƈ提交了修攏V如果事?再次d了那一行,那么Q事?得C不同的数|被更新或删除Q?br />
l qd读( phantom read Q:一行数据满x索规则,却在开始没有被看到。例如:事务1d了一pd满搜烦规则的行Q而事?插入或删除了一个满事?搜烦规则的行。如果事?再次执行查询语句Q就会得C同的一pd行?/span>
SQL-99 标准定义了下列隔ȝ别:
l 未提交读Q?/span> read uncommitted Q(隔离事务的最低别,只能保证不读取物理上损坏的数据)
l 已提交读Q?/span> read committed Q(数据库引?/span> 的默认别)当一个事务运行在q个隔离U别Ӟ 一?/span> SELECT 查询只能看到查询开始之前提交的数据Q而永q?/span> 无法看到未提交的数据Q或者是在查询执行时其他q行的事务提交做的改变?/span>
l 可重复读Q?/span> repeatable read Q,不会脏读和非重复读,可能发生qd?/span>
l
可串行化Q?/span>
serializable
Q(隔离事务的最高别,事务之间完全隔离Q?br />
ANSI/ISO SQL
隔离U别
隔离U别 |
脏读Q?span lang="EN-US">DirtyReadQ?/span>
|
不可重复的读Q?span lang="EN-US">Non-Repeatable ReadQ?/span>
|
qd
dQ?span lang="EN-US">Phantom ReadQ?/span>
|
未提交读
Q?span lang="EN-US">Read uncommittedQ? |
可能 |
可能 |
可能 |
已提交读
Q?span lang="EN-US">Read committedQ? |
不可? |
可能 |
可能 |
可重复读Q?span lang="EN-US">Repeatable readQ? |
不可? |
不可? |
可能 |
可串行化Q?span lang="EN-US">Serializable Q? |
不可? |
不可? |
不可? |