一、事物的介绍

①一个或者一组SQL语句组成一个执行的单元,这个单元要么全部执行(commit),要么全部不执行(rollback),可以理解为一个最小的不可分割的单元,主要保证数据的一致性。

②在MySQL中只有Innodb数据库引擎支持事物。

③只有DML语句才有事物,主要有(insert、update、delete)。

二、事物的分类

①扁平事物

最简单的事物,使用最多的事物,由BEGIN WORK开始,由COMMIT WORK 或者 ROLLBACK WORK结束,之间的操作都是原子性的,要么全部执行,要么全部回滚。

②带保存点的事物

基于扁平事物之上的,允许在事物执行过程中回滚到事物中较早的一个状态。

③链事物

保存点事物的一个变种,保存点事物在系统宕机时候,所有的保存点是易丢失的,当系统重新恢复的时候,事物需要重新开始执行,不能从最近的保存点断点执行。链事物是指在提交事物的时候,释放不需要的数据对象,将必要的处理上下文的隐式的传给下一个要开始的事物,提交事物和开启下一个事物合并为一个原子操作,像一个事物在执行。链事物的回滚只针对于当前的保存点,带保存点的事物能回滚到任意正确的保存点。

④嵌套事物

嵌套事物是一个层次的结构框架,一个顶层的事物控制着各个层次的事物,顶层之下嵌套的事物称为子事物,父事物回滚,子事物也会跟着回滚,子事物具体ACI属性,不具有D的特性。

⑤分布式事物

分布式事物是在分布式环境下运行的扁平事物。

注:Mysql 的innodb数据库引擎,不支持嵌套事物,其余均支持。

三、事物的特性(ACID)

①原子性(Atomicity)

一个事物中的所有操作,要么全部完成,要么全部不完成,不会结束在某个环节。事物在执行的过程中发生的错误,会被回滚到事物开始前的状态,就像整个事物从来没有执行过一样。

②一致性(Consistency)

一致性是指事务将数据库从一种状态转变为另一种状态,在事物开始之前和事物结束之后,数据库的完整性没有被破坏。

③隔离性(Isolation)

数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。

④持久性(Durability)

事物处理结束后,对数据的修改就是永久的,即使系统故障也不会丢失。

四、事物的创建

1.隐式事物和显式事物

隐式事物:事物没有明显的开始结束标志,类似于insert、update、delet语句。

显式事物:事物具有明显的开始或者结束标志

因为mysql的innodb数据库引擎的事物默认是开启状态,显式事物的开启的前提是将自动提交功能设置为禁用。

2.事物控制语句

①start transaction | begin:显式的开启事物。前提将autocommit关闭。

②commit:提交事物,只要执行正确的指令,对数据的修改是永久性。

③rollback:取消所有事物,并撤销正在进行的所有未提交的修改。

④savepoint spname:在事物中创建保存点。

⑤release savepoint spname:删除事物的保存点。

⑥rollback to spname:把事物回滚到标记点,回滚点事前的事物成功,之后的回滚。

⑦ select @@autocommit:查询事物是自动提交状态

show variables like "autocommit";

⑧set autocommit = 0:禁用自动提交

set autocommit = 1:开启自动提交

⑨查看隔离级别

select @@tx_isolation;

⑩设置隔离级别

set global | session transaction isolation level 隔离级别;

3.演示事物

准备数据

java mssql 事务 msql事物_数据库


案例1:沉醉向花花转账20元

java mssql 事务 msql事物_java mssql 事务_02


案例2:沉醉向花花转账100,系统突然出错

java mssql 事务 msql事物_java mssql 事务_03


案例3:事物演示delete 和 truncate

delet支持事物,truncate不支持事物

java mssql 事务 msql事物_java mssql 事务_04


java mssql 事务 msql事物_java mssql 事务_05


案例4:savepoint的演示

java mssql 事务 msql事物_mysql_06


五、并发事物问题和事物的隔离级别

1.并发事物处理带来的问题

①脏读

一个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致状态;这时,另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些“脏”数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被形象地叫做”脏读”。

事务A读取到了事务B已修改但尚未提交的的数据,还在这个数据基础上做了操作。此时,如果B事务回滚,A读取的数据无效,不符合一致性要求。

②不可重复读

一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了改变、或某些记录已经被删除了!这种现象就叫做“不可重复读”。

事务A读取到了事务B已经提交的修改数据,不符合隔离性

③幻读

一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为“幻读”。

事务A读取到了事务B体提交的新增数据,不符合隔离性。

注意:

脏读是事务B里面修改了数据。

幻读是事务B里面新增了数据。

2.事物隔离级别

①read uncommitted(读未提交):事物的修改,即使没有提交,对其他事物也是可见的。事物读未提交的数据成为脏读。

②read committed(读以提交):一个事物在提交之前,所做的任何修改对其他事物都是不看见,但是对其他事物称为不可重复读,因为两次查询的结果可能不一样。

③repeatable read(可重复读):该级别解决了脏读、不可重复读的问题,保证了在一个事物中多次读到的数据是一致的,但是没有解决幻读的问题。

④serializable(串行化):会在读取每行数据的时候加锁,避免了幻读的问题。

3.事物隔离级别演示

①读未提交

java mssql 事务 msql事物_mysql_07


②读已提交 但是不能避免重复读

java mssql 事务 msql事物_java mssql 事务_08


如果左边提交了,右面会读到两次不一样的数据

java mssql 事务 msql事物_transection_09


③可重复读

java mssql 事务 msql事物_事物_10


java mssql 事务 msql事物_事物_11


没有避免幻读

java mssql 事务 msql事物_事物_12


④串行化

java mssql 事务 msql事物_事物_13


java mssql 事务 msql事物_java mssql 事务_14


阻塞状态,一方提交另一方才能进行下一步操作,可以避免幻读,但是处理高并发效率较低,mysql默认为第三级别。

java mssql 事务 msql事物_数据库_15


数据库的事务隔离越严格,并发副作用越小,但付出的代价也就越大,因为事务隔离实质上就是使事务在一定程度上 “串行化”进行,这显然与“并发”是矛盾的。同时,不同的应用对读一致性和事务隔离程度的要求也是不同的,比如许多应用对“不可重复读”和“幻读”并不敏感,可能更关心数据并发访问的能力。