事务特征的四个特征和事务并发问题
-
事务简介
- 事务(Transaction)是由一系列对系统中数据进行访问与更新的操作所组成的一个程序执行逻辑单元。
- 这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行。
- 事务是一组不可再分割的操作集合。
-
产生事务的语句
- 只有
DML(insert,delte,update)
语句才会产生事务,其他语句不会产生事务。 DML
语句执行的时候,如果当前有事务,就使用这个事务,如果没有,执行的DML
语句就会产生一个新的事务commit/rollback/DDL(create,drop)
语句都可以把当前事务给结束掉
- 只有
-
事务的提交与数据
-
commit/DDL
结束事务是把这个事务给提交。- 事务提交是指:这个事务里面所有的操作都生效到数据库中
- 回滚事务是指: 这个事务里面所有的操作都撤销。
-
如果一个客户端对一张表进行DML操作,但是没有提交事务,那么其他的客户端就不能对这个表进行DML操作(手动测试)。
-
事务案例
DML 语句一定要提交试图
-
-
事务特征(ACID)
-
Automic 原子性
整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
例如:银行转账,从 A 账户转 100 元至 B 账户,分为两个步骤:从 A 账户取 100 元;存入 100 元至 B 账户。这两步要么一起完成,要么一起不完成
-
Consistency 一致性
在事务开始之前和事务结束以后,数据库数据的一致性约束没有被破坏;即当事务 A 与 B 同时运行,无论 A,B 两个事务的结束顺序如何,数据库都会达到统一的状态。
例如:银行转账,从 A 账户转 100 元至 B 账户,无论账户之间转了多少次,两个人的钱的和与转账之前钱的和是一致的。
-
Isolation 隔离性
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据 库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事 务之间要相互隔离。事务独立
对于任意两个并发的事务T1和T2 , 在 事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发执行-
-
Durability 持久性
当某个事务一旦提交,无论数据库崩溃还是其他未知情况,该事务的结果都能够被持久化保存下来。
-
-
事务并发所带来的问题
当并发访问数据库时,那么数据库会进行事务隔离操作。以保证获取数据的准确性。但是当高并发的情况话,事务隔离可能会带来以下问题
- 脏读
- 不可重复读
- 幻读
-
脏读
主要是update操作所引起的。一个事务A读取到了事务B修改但是还未提交的数据。
当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个其他的事务来访问该数据,就会有可能 造成两个事务得到的数据不一致。
例如:用户A向用户B转账100 元
update account set money=money - 100 where name = 'A'; -- 此时 A 通知 B 但是没有提交事务
当 执行了 第一条sql语句 , 此时 A通知B 说钱已经转了。那么B查看账户钱确实到了,这就是脏读。
事后 A 进行事务回滚。 那么 当 B再次查看, 钱没了。
正常情况下 当 A转了钱以后,没有提交事务,那么 B 是看不到 账户多了 100的,但是由于发生了脏读,那么看见了。
-
不可重复读
主要update操作引起 。 事务A在第一次读数据和第二次读数据之间,有另一个事务B把这个数据更改并提交了,所以就出现了 事务A里面读数据俩次,但是读到的结果是不同的。
事务T1 在读取数据据 , 而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发生了不可重复读。
不可重复读和脏读的区别是,脏读是读取了一个事务修改但是并没提交的数据。不可重复读是读取了前一个事务已经提交的数据。
但其实某些情况下,不可重复读反而不是问题,多读取数据不一致,那么以最后一次为主。但是特殊情况例外:例如 A B读取同一个数据,但是读取的结果确实不一样的,那么就是导致分歧。
-
幻读
主要是insert/delete引起。事务A第一次用where条件筛选出了10条数据,事务A第二次用通样的where条件筛选出的 却是11条数据,因为事务B在事务A的第一次和第二次查询之间进行了插入操作,并且插入的这个数据满足事务A的where筛选条件, 就好像产生幻觉一样,这就是发生了幻读
幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不
同),所不同的是不可童复读査询的都是同一个据项,而幻读针对的是一批数据整体(比如数据的个数)。