事务的特性:
ACID
原子性(Atomicity):事务是数据库的逻辑工作单位,它对数据库的修改要么全部执行,要么全部不执行。
一致性(Consistemcy):事务前后,数据库的状态都满足所有的完整性约束。
隔离性(Isolation):并发执行的N个事务是隔离的,一个不影响一个,一个事务在没有commit之前,被修改的数据不可能被其他事务看到(通过设置数据库的隔离级别)。
持久性(Durability):持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。持久性主要在于DBMS的恢复性能
数据库的脏读、不可重复读、幻读都和事务的隔离性有关
脏读:事务A未提交时,事务B就读了事务A未提交的数据(更新) 因为事务A有可能回滚。
换句话说就是:在一个事务中读取到另一个事务没有提交的数据
不可重复读:事务B一直未提交,并且多次查询某条数据,而事务A去修改该数据修改之后并提交,但在这个过程中,事务B一直未提交,且多次进行查询该条数据,而且发现该条数据结果不一样。(更新)
换句话说就是:在一个事务中,两次查询的结果不一致,查询的记录数一致
幻读:事务B根据某些条件进行查询但是一直不提交;此时事务A像添加或删除相同条件下的数据并进行提交;此时事务B
多次查询的数据数量不一样。(添加或则删除)
换句话说:在一个事务中,多次查询的结果不一致,指查询的记录数不一致
read uncommitted 读未提交 脏读,不可重复读,幻读都会出现
read committed 读已提交,可以避免脏读
repeatable read 可重复读,可以避免脏读和不可重复读
serializable 串行化,可以避免所有问题
起初隔离级别为read uncommitted 读未提交;a,b两个会话,分别开启两个事务,然后a向b转了500元钱,但a未提交该事务,
此时b查看,发现多了500.然后a回滚事务,b再查看账户,发现根本就没有多500.这便是脏读。
脏读便是可以读取到另一个事务尚未提交的数据。
如果我们此时将隔离级别提升为read committed 读已提交,便可避免脏读。同样b两个会话,分别开启两个事务,然后a向b转了500元钱,
但a未提交该事务,此时b查看,依旧是原钱数.
但此时,如果a 提交事务,b再去查看,发现此时多了500,对b而言,在一个事务中,两次查询的结果不一致,这便是不可重复读。
如果我们此时将隔离级别提升为repeatable read 可重复读,可以避免脏读和不可重复读的发生。同样a 提交事务,b再去查看,发现
依旧是原钱数,b只能结束当前事务,在开启一个新事务,才能查询到数据的变化,这al便避免了不可重复读。
如果我们设置了seriizable串行化,就相当于锁表,某一时间内只允许一个事务访问该表。