数据库的事务
事务的四个重要特性:
原子性(要么全部成功,要么全部失败回滚)
一致性(多种状态转换后结果不变)
隔离性(多个事务并发之间不受互相影响)
持久性(事务一旦提交,数据库的数据就是永久的)
事务的隔离性:
为了解决事务并发时的安全问题。
事务并发存在的问题:
脏读:事务A读取了事务B未提交的数据。
隔离级别设置成Read Committed可避免,但是仍会造成不可重复读的问题。
Sql Server , Oracle默认是Read Committed。
不可重复读:数据库的某条数据,在一个事务范围内,多次查询返回的结果不同,这是因为查询间隔内改数据被别的事务修改了。
隔离级别设置成Repeatable read可避免。
MySql默认就是Repeatable read。
幻读:一个事务在读时,另一个事务插入或者删除了新的记录,影响了读的结果。
Serializable最高事务隔离级别,可避免脏读、不可重复读、幻读,但是性能低,因为该级别下事务串行执行。
区别:
脏读是读取了另一个事务未提交的数据,不可重复读是读取了上一个事务提交的数据。
幻读和不可重复读都是读取了另一条已经提交的事务(区别于脏读的未提交),
不同的是,不可重复读查询的都是同一条数据,关注点是更新操作,而幻读关注的是插入或删除的问题。
数据库的隔离级别:
MySQL支持四种,默认Repeatable read。
Oracle只支持Serializable 和Read committed,默认是Read committed。
-------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------
查看当前事务的隔离级别:
select @@tx_isolation;
修改当前事务的隔离级别:
SET tx_isolation='REPEATABLE-READ';
数据库并发控制:
乐观锁:假设事务不会冲突,不锁住任何东西,只是提交时检查是否发生冲突,如果冲突就回滚。
实现方式一般是记录数据版本
悲观锁:假设事务会冲突,将数据处于锁定状态,别的事务不可操作。
实现方式是依靠数据库的锁机制。