数据库事务的特性(ACID):
原子性(Atomic)
表示组成一个事务的多个数据库操作是一个不可分割的原子单元事务作为一个整体被执行,包含在其中对数据库的操作要么全部被执行,要么都不执行。
一致性(Consistency)
事务应确保数据库的状态从一个一致状态转变为另一个一致状态,事务操作成功后,数据库所处的状态和它的业务规则是一致的.
隔离性(Isolation)
在并发数据操作时,不同的事务拥有各自的数据空间,它们的操作不会对对方产生干扰。一个事务的执行不应影响其他事务的执行。
持久性(Duarability)
一旦事务提交成功后,事务中所有的数据操作都必须被持久化到数据库中,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
数据库事务并发问题:
丢失或覆盖更新 ( Lost Update )
第一类更新丢失(修改丢失) 事务A和事务B同时访问同一个数据, 事务B先提交修改,事务A回滚操作 ,导致事务B的修改丢失。 第二类更新丢失(修改覆盖) 事务A和事务B同时访问同一个数据, 事务B先提交修改,事务A再修改提交。 导致事务B的修改被 覆盖
脏读(Dirty Read)
事务1将C值修改为200, 事务2读到C为200 . 而事务1由于某种原因撤销,其修改作废,C恢复原值100. 事务2读到的就是不正确的“脏“数据了
不可重复读 (nonrepeatable read)
事务1读取某一数据后 事务2对其做了修改 ,没有提交 当事务1再次读数据时,得到的与第一次不同的值。
幻像读/虚读(Phantom read)
事务1按一定条件从数据库中读取某些数据记录后未提交查询结果,事务2删除了其中部分记录 事务1再次按相同条件读取数据时,发现某些记录神秘地消失了或者事务1按一定条件从数据库中读取某些数据记录后未提交查询结果事务2插入了一些记录 事务1再次按相同条件读取数据时,发现多了一些记录
(1)读取未提交/脏读(READ UNCOMMITTED) 事务隔离的最低级别,事务可能查询到其它事务未提交的数据, 仅可保证不读取物理损坏的数据
(2)读取已提交(READ COMMITTED) oracle默认级别,保证不读脏数据。
(3)可重复读(REPEATABLE READ) mysql保证不可重复读,但有可能读入幻像数据。
(4)可串行化(SERIALIZABLE) 事务隔离的最高级别,事务之间完全隔离。
mysql设置事务的隔离级别:
set session transaction isolation level 事务级别;
oracle设置事务的隔离级别:
set transaction isolaction level 事务级别;
oracle默认的事务隔离级别:read commited
mysql默认的事务隔离级别:repeatable read