JDBC事务

事务: 掌握1.概念2.四大特性3.传播行为4.隔离级别

1.关于数据库事务隔离级别的介绍

事务: 一个SQL或一组SQL语句组成的工作单元,    SQL之间有相互依赖的关系!

事务(Transaction):所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单元。例如,银行转账工作:从一个账号扣款并使另一个账号增款,这两个操作要么都执行,要么都不执行。所以,应该把它们看成一个事务。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。

针对上面的描述可以看出,事务的提出主要是为了解决并发情况下保持数据一致性的问题。事务是并发控制的基本单位。

注意事务的概念,事务可以保证多个操作的原子性,要么全部成功,要么全部失败.

我认为事务,就是一组操作数据库的动作集合.

2.事务有四个特征ACID(简要了解即可)

a)         原子性(Atomicity),事务中包括的操作要么全部成功,要么全部失败.

b)         一致性(Consistency),表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态.

c)         隔离性(Isolation),指一个事务执行不能被其他事务干扰

  1.                          i.              未提交读
  2.                        ii.              提交读
  3.                       iii.              可重复读
  4.                       iv.              序列化读

d)         持续性(Durability),指事务结束后,事务处理的结果必须得到持久化.

 

3.事务的传播行为(PROPAGATION), 多个事务嵌套时,事务的传递方式.

REQUIRED:  required
   业务方法需要在一个事务中运行,如果方法运行时,已经存在一个事务中,那么加入到该事务,否则自己创建一个新事务。

SUPPORTS:  supports
   如果存在一个事务,那么使用当前事务,如果没有事务,则不使用事务。

MANDATORY: mandatory
   如果有一个事务,则使用事务,如果没有可以使用的事务,则发生异常。

REQUIRESNEW:  requiresnew
  不管是否存在事务,业务方法总为自己发起一个新事务;如果方法已经运行在一个事务中,则原有事务会被挂起,新的事务会被创建,直到方法调用结束,新事务才结束,原先的事务再恢复执行。

NOT_SUPPORTED:   not_supported
   声明方法不需要事务,如果方法没有关联到事务,容器不会为它开启事务,如果方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,原先的事务便会恢复执行。

NEVER:    never
   业务方法绝对不能再事务范围内执行,如果方法在某个事务中执行,容器会抛出例外,只有业务方法没有关联到任何事务,方法才能够正常执行。

NESTED:   nested
  如果一个活动的事务存在,则运行在一个嵌套的事务中,如果没有活动事务,则按照REQUIRED属性执行,它使用了一个单独的事务,这个事务有多个可以回滚的保存点,内部事务的回滚不会对外部事务产生影响。它只对DataSourceTransactionManager事务管理器有效。

----------------------------------------------------------------------

4.事务的隔离级别

多个事务并发运行,经常会操作同一个数据来完成他们的任务,但是会导致以下问题:脏读,不可重复读,幻读.

脏读:(读——改(不提交)——再读(看不到)Oracle中不会出现脏读)
    一个事务读取到另一个事务更新但是未提交的数据。如果这些改变在稍后被回滚,那么前一个事务读取到得数据就是无效的,也就是脏数据。
不可重复读(Oracle):(读——改(提交)——再读(不一样))
    在同一事务中,多次读取同一数据返回的结果有所不同,即后续读取可以读取到另一事务已提交的更新数据;相反,"可重复读"是指在同一事务中多次读取数据时,能够保证所读取的数据是一样,即后续读取不能读到另一事务已提交的数据。
幻读(Oracle):(统计——插入(提交)——再统计(不准确))
    一个事务读取到另一事务已提交的insert数据。

在理想状态下,事务应该完全相互隔离,以防止问题的发生,完全隔离会影响性能,因为隔离经常牵涉到锁定在数据库中的记录,有时甚至是完整数据表,锁定后会阻碍并发,要求事务相互等待来完成工作,

完全隔离会影响性能,所以可以在事务隔离上有些弹性,因此有好几个隔离级别。

 

注:Spring中事务的隔离级别是由数据库实现的

ISOLATION_DEFAULT
    这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应
ISOLATION_READ_UNCOMMITTED 这是事务最低的隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读

ISOLATION_READ_COMMITTEDOracle默认隔离级别)  读已提交
    保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。

ISOLATION_REPEATABLE_READ(MySQL 默认隔离级别) 可重复读
    这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。

(行级锁  select 。。。for update)

ISOLATION_SERIALIZABLE
    这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。

(表级锁) (更新(未提交)——删除(资源正忙不让删))

财务系统统计时间很长,隔离级别会很高,有些特殊工具可以进行表级锁。

Oracle默认是 ISOLATION_READ_COMMITTED  读已提交

隔离级别越高,安全性越高,但是性能越低!

 

l  脏读取(Dirty Reads):一个事务读取到另一个事务更新但是未提交的数据。如果这些改变在稍后被回滚,那么前一个事务读取到得数据就是无效的,也就是脏数据。

l  不可重复读取(Non-repeatable Reads):一个事务对同一行数据重复读取两次,但是却得到了不同的结果。例如,在两次读取的中途,有另外一个事务对该行数据进行了修改,并提交。

l  幻读(Phantom Reads):事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据(这里并不要求两次查询的SQL语句相同)。这是因为在两次查询过程中有另外一个事务插入(insert)数据造成的。

posted @ 2015-09-29 12:44  xiaoguozi0218  阅读(95)  评论(0编辑  收藏  举报