1、事务的定义
事务是一种机制,一个操作序列,包含了一组数据库的操作命令,所有命令都是一个整体,作为一个整体向系统提交或者撤销的操作,要么都执行,要么都不执行,是一个不可分割的单位
2、事务的特点ACID
A原子性:最小单位,事务里的所有条件都是一个整体,不可分割,要么都成功,要么都失败
C一致性:事务开始之前和事务结束之后,数据库的完整性约束没有被破坏。事务完成时,数据必须处于一致状态;事务开始前,数据库中的存储数据也处于一致状态;事务进行中,数据可能处于不一致。当事务最终完成时,必须再次回到已知的一致状态
I隔离性:只在并发环境中,不同事务同时操作相同的数据时,每个数据都有各自的完整的数据空间,对数据进行修改所有并发事务是彼此隔离的,表明事务必须是独立的。修改数据的事务可以在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同的事务结束之后访问这些数据
D持久性:数据一旦提交,事务的效果将永久保留在数据库中,并且不会被回滚
总结:在事务管理中,原子性是基础,隔离性是手段,保证原子性,一致性是目的,持久性是最终结果
3、mysql支持的四种隔离级别
①未提交读:允许脏读。允许一个事务可以看到其他事务未提交的修改
②提交读:防止脏读。事务只能查看已经提交的修改数据,未提交的修改不可见。orcale和sql server使用此隔离方式(常用)
③可重复读:mysql的默认隔离级别。确保子啊一个事务中执行两次相同的select语句时,都能得到相同的结果,不论其他事务是否提交修改。可防止脏读及不可重复读(常用)
④串行读:锁表。完全串行化,每一个事务都隔离,读写都阻塞。降低数据库的效率(不用)
4、数据出错原因(生产环境不会出现这些问题)
(1)脏读:一个事务可以看到另外一个事务未提交的修改结果
(2)不可重复读:一个事务内,多次读同一数据。前一个事务还没有结束,另一个事务也访问该数据。在一个事务内,两次查询到结果不一致,读不到相同的数据内容(测试环境中常见)
(3)幻读:一个事务对一个表中的数据进行修改,可能涉及到表中的全部数据,另一个事务也修改此表中的数据,前一个事务会发现表中仍然有数据未修改,类似于幻觉(测试环境中常见)
(4)丢失更新:两个事务同时修改同一条记录,A先修改记录,B后修改记录,B一旦提交会覆盖A的修改结果(测试环境中常见)
5、如何避免数据出错
(1)权限控制(关键)
(2)根据情况使用隔离级别。生产环境最好是提交读,或提交读和可重复读,确认之后发生改变。测试环境隔离级别任意
(3)生产环境只能允许一个人对一个事务进行操作,A操作时,其他人不允许操作
6、事务隔离级别的作用范围
(1)全局级:对所有的会话有效
(2)会话级:只对当前的会话有效
7、查询隔离级别
(1)查询全局事务的隔离级别
①show global variables like '%isolation';
②select@@global.tx_isolation;
(2)查询会话事务的隔离级别
①show session variables like '%isolation';
②select@@session.tx_isolation;
8、设置隔离级别
(1)修改全局事务的隔离级别
永久修改:set global transaction isolation level read uncommitted;
临时修改,重启服务即失效:set @@global.tx_isolation='read uncommitted';
(2)修改会话事务的隔离级别
永久修改:set session transaction isolation level read uncommitted;
临时修改,重启服务即失效:set @@session.tx_isolation='read uncommitted';
9、事务的控制语句
begin、start、transaction显示的开启事务
commit、commit work提交事务
rollback、rollback work回滚事务(撤销正在进行的所有未提交的修改)
savepoint 名称 创建回滚点(一个事务可有多个回滚点)
rollback to 名称 回滚到还原点
注意:
①多点还原S1和S2。若还原到S1,S2消失;若提交,所有还原点全部消失
②mysql提交事务默认自动提交,必须以begin开始才能设置还原点
10、实题
问题:set autocommit=0;关闭自动提交
如果不是自动提交会出现什么情况?
解答:黑色的是一个事务,白色的是另一个事务
结论:自动提交关闭,必须commit修改记录对数据库的操作才会真正生效,具有持久性