关于事务和丢失更新

1.1.1    事务的特性:(面试)

事务四大特性:

  * 原子性(Atomicity)  :强调的事务的不可分割.

  * 一致性(Consistency)    :强调的事务的执行前后,数据库的的完整性保持一致.

  * 隔离性(Isolation)  :强调的事务的并发的访问,一个事务的执行,不应该受到另一个事务的打扰.

  * 持久性(Durability) :强调的事务结束之后,数据就永久的保存的数据库中.

 

如果不考虑事务的隔离性:引发一些安全性问题.

  * 脏读       :一个事务,读到了另一个事务未提交数据.

  * 不可重复读 :一个事务,读到了另一个事务的提交数据(update).导致查询结果不一致.

  * 虚读(幻读) :一个事务,读到了另一个事务的提交数据(insert).导致查询结果不一致

 

数据库中事务的隔离级别:

  * read uncommitted(未提交读) :脏读、不可重复读、虚读都是有可能发生的.

  * read committed(已提交读)   :避免脏读,但是不可重复读和虚读是有可能发生的.

  * repeatable read(重复读)    :避免脏读、不可重复读.但是虚读是有可能发生的.

  * serializable(串行的)       :避免脏读、不可重复读、虚读的发生.

 

  * 安全性:read uncommitted   <  read committed  < repeatable read  < serializable

  * 效率:read uncommitted  > read committed  > repeatable read > serializable

 

  ***** 数据库会比对安全性和效率问题:一般不会采用read uncommitted 和 serializable

  * MYSQL数据库默认的隔离级别:repeatable read

  * Oracle数据库默认的隔离级别:read committed

 

mysql中做一个事务操作,不想被别的事物操作打扰,就只能把隔离级别设置成串行化(serializable).这样就是单线程.速度慢.

oracle中可以把隔离级别设置成自身固有的readonly隔离级别.

这种隔离级别可以查,不可以改.

面试问oracle有几个隔离级别,答案有三个!

自身支持的两个和一个固有的readonly.

关于Oracle支持的隔离级别:

 

 

1.1.2    JDBC中设置事务的隔离级别:

conn.setTransactionIsolation(int level) --- 设置事务的隔离级别.

 

1.1.13   丢失更新(扩展)

解决:

  1.悲观锁:假设丢失更新一定会存在,采用是数据库一种锁机制.(排他锁)

  2.乐观锁:假设丢失更新不一定存在,采用在数据库中添加一个字段完成.

悲观锁解决原理:

乐观锁解决原理:

 

原文地址:https://www.cnblogs.com/DreamDrive/p/4090919.html