事务是数据库中一组最小的运行单元。其他不管包含了多少SQL语句都具备要么一起成功,要么一起失败的特点。
事务的特性
名称 | 描述 |
---|---|
A(原子性) | 原子性就是指事务是一个不可以分割的工作单元。事务中的操作要么都发生,要么都不发生。 |
C(一致性) | 事务前后数据的完整性必须保持一致 |
I(隔离性) | 事务的隔离性发生在多线程高并发的情况下。数据库会给每个客户端开启一个事务,A客户端对数据库的操作不会被其他客户端干扰。这就是各个事务之间相互隔离。 |
D(持久化) | 事务一旦提交就变为了不可逆状态。数据已经进行了IO操作。对于本次事务来说,数据已经是不可逆状态。 |
事务的并发问题
问题名称 | 描述 |
---|---|
脏读 | 一个事务读取到了另外一个事务未提交的数据 |
不可重复读 | 在一个事务中读取表内的一行数据,多次读取的结果不同 |
幻读(虚读) | 一个事务中读取了其他数据插入的数据,导致前后读取不一致 |
隔离级别
在数据库中为了保证并发情况下读取数据的正确性,数据库本身提供了事务隔离级别。
读未提交:一个事务可以读取到其他事务未提交的数据,这种隔离级别下,所有的查询都不加锁,一致性最差。
注意:如果设置成此隔离级别那么上述的三个问题都会出现。
读已提交:一个事务只能读取到其他事务已经提交的数据。这种隔离级别可以解决脏读的问题。但是不可重复读和幻读问题还是可能出现、
注意:绝大部分数据库默认的都是此隔离级别(oracle)。但是mysql不是、
可重复读:事务在执行过程中可以读取到其他事务已经提交的数据。但是不能读取其他事务对数据的修改、此隔离级别可以解决脏读和不可重复读问题。但是还是可能出现幻读问题
注意:mysql默认的此种隔离级别
串行化:并发的事务使用串行化的方式执行。一个事务执行,其他事务等待。此种隔离级别可以避免上述三个问题。但是并发能力太差(效率太低)
总结:具体使用那种隔离级别根据业务定。