1.事务是什么?
定义:
数据库事务是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)
组成:
一个数据库事务通常包含对数据库进行读或写的一个操作序列
目的:
1,为数据库操作提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法
2,当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作相互干扰
总结:事务的目的就是要提供3种状态:
- 1,失败恢复方法
- 2,保持一致性的方法
- 3,操作隔离的方法
异常情况下
1,能将数据恢复到正常状态
2,要保证一致性,包含数据的一致性和约束一致性
并发情况下
并发的操作之间不能产生相互影响
2.事务的特性
3.事务并发的异常
- 回滚丢失/第一类更新丢失(Update Lost)
此种更新丢失是因为回滚的原因,所以也叫回滚丢失
- 覆盖丢失/第二类更新丢失(Seconde Update Lost)
此种更新丢失是因为更新被其他事务给覆盖了,也可以叫覆盖丢失
- 脏读(Dirt Read)
此种异常是因为一个事务读取了另一个事务修改了但是未提交的数据
- 不可重复读(Not Repeatable Read)
这种异常是一个事务对同一行数据执行了两次或者更多次查询,但是却得到了不同的结果
- 幻读(Phantom Read)
幻读和不可重复读有点像,只是针对的不是数据的值而是数据的数量
回滚丢失 VS 覆盖丢失
脏读
不可重复读 VS 幻读
4.事务的隔离级别
- 1,读未提交(Read Uncommitted)
该隔离级别指即使一个事务的更新语句没有提交,但是别的事务可以读取到这个改变
- 2,读已提交(Read Committed)
该隔离级别指一个事务只能看到其他事务的已经提交的更新,看不到未提交的更新,消除了脏读和第一类丢失更新,这是大多数数据库的默认隔离级别,如Oracle,SqlServer
- 3,可重复读(Repeatable Read)
该隔离级别指一个事务中进行两次或多次同样的对于数据内容的查询,得到的结果是一样的,但不保证对于数据条数的查询是一样的,只要存在读改行数据就禁止写,消除了不可重复读和第二类更新丢失,这时Mysql数据库的默认隔离级别
- 4,串行化(Serializable)
事务执行的时候不允许别的事务并发执行,完全串行化的读,只要存在读就禁止写,但可以同时读,消除幻读。这是事务隔离的最高级别,虽然最安全最省心,但是效率太低,一般不会用。
各种隔离级别能解决那些并发异常