数据库事务整理
1.首先是事务的概念:是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。举个例子:比如银行转账问题,A给B转账100块钱,应该是要分为两步操作,第一显示A的余额-100,再就是B的余额+100,这两个操作要么都成功,要不都不能成功,这两个操作是一个不可拆分的,也就是下面说的原子性。
2.再就是事务的四大特性:原子性,一致性,隔离性,持久性。
3.如果在没有多线程控制机制的情况下,多个事务并发执行,会发生以下几个问题:
脏读:A事务读取数据库的某条记录,但是这条记录是B事务更新未提交的,所以,A事务读取的数据很可能因为B事务回滚而导致数据不正确。
不可重复读:A事务连续读取数据库的某条已被提交的记录,但是B事务在A事务读取的间隙又对该记录更新并提交了,A事务读取的多次数据就会不正确。
幻读:
4.对于处理以上四种情况,有四个级别的处理方案:Read Uncommitted,Read Committed,Repeatable Read,serializable(读未提交、读已提交、可重复读、串行化)
Read UnCommitted:事务的各种问题均无法避免,因为数据库允许某事物读取未提交的数据。
Read Committed: 可以防止脏读,因为数据库只允许事务读取的时候读取已提交的数据,因此数据库不得不采用锁,此级别锁行。
Repeatable Read:可以防止脏读和不可重复读问题,因为此级别下某事物读取数据将会禁止写数据的其他事务(但允许读事务),写事务则禁止任何其他事。
Serializable: 最狠的一种,要求每个事务已串行化的方式进行执行,A事务不结束B事务不能开始,知道A事务完成才行。
注意:四大隔离级别从上到下越来越安全,安全的代价就是性能,为了防止多线程事故,数据库只能加锁,这就限制了性能,而且还可能出现死锁,所以
选用隔离级别的候要小心选用。
5.常见数据库的隔离级别
mysql具有四大隔离级别,默认为Read Committed,设置隔离级别语句为:
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
Oracle中只有两隔离级别:Read Committed和Serializable,默认为Read Committed。