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.乐观锁:假设丢失更新不一定存在,采用在数据库中添加一个字段完成.
悲观锁解决原理:
乐观锁解决原理: