概念: 指单个逻辑工作单元执行的一系列操作,要么全部成功,要么全部失败.
(ACID)四大特性:
1)A(原子性):数据库开启事务与提交事务之间的一系列操作,要么全部执行成功,要么有一条数据执行失败即全部执行失败并进行回滚。
2)C(一致性):数据库开启事务前,与提交事务后数据库中的数据在逻辑上是一致的,不变的。(比如A有100,B有100,转账前总和200,A给B转账50后,A有50,B有150,总和还是200,即满足一致性。)
3)I(隔离性):在并发操作中,不同的事务操作之间必须处于相互隔离的状态,以保证并发操作中数据的正确性;并且数据所处的状态要么是事务开启之前的状态,要么是事务提交之后的状态。
4)D(持久性):事务一单提交后,提交的数据必须持久化到数据库中,以保证可以恢复数据。
在并发情况下:
如果数据库没有采取数据隔离级别,会产生:
1)脏读:一个事务读取到了另一个事务的未提交更新的数据.
2)不可重复读:一个事务读取两次同一个数据,读到不同的结果,即另一个事物对数据进行了修改操作(主要针对修改操作).
3)幻读(虚读):一个事务对同一张表查询两次,得到不同的结果,即另一个事物对数据进行了插入或删除操作(主要针对插入或删除操作).
为解决上述问题,可设置数据库的隔离级别.
set tx_isolation='隔离级别';
1)READ UNCOMMITTED(读未提交数据)
安全级别最低, 可能出现任何事务并发问题(比如脏读、不可以重复读、幻读等)
性能最好(不使用!!)
2)READ COMMITTED(读已提交数据)(Oracle默认)
防止脏读,没有处理不可重复读,也没有处理幻读;
性能比REPEATABLE READ好 pereatable
3)REPEATABLE READ(可重复读)(MySQL默认)
防止脏读和不可重复读,不能处理幻读问题;
性能比SERIALIZABLE好
4)SERIALIZABLE(串行化)
不会出现任何并发问题,因为它是对同一数据的访问是串行的,非并发访问的;
性能最差;
如何查看隔离级别:
命令: select @@tx_isolation;