目录
概述
TCL-->Transaction Comtrol Language 事务控制语言
事务: 一个或者一组sql语句组成一个执行单元,这个执行单元要么全部执行要么全部不执行.
如果单元中某条sql语句一旦执行失败或者产生错误那么整个单元将产生回滚,所受到影响的数据回到原来事务开始的状态,如果成功,则事务顺利执行
在mysql中用的最多的存储引擎有: innodb,myisam,momory 等;其中 innodb支持事务,而mysiam,momory等不支持事务
查询数据库的存储引擎
SHOW ENGINES
事务的ACID(acid)属性
- 原子性(Atomicity) 指的是事务是不可分割的,要么都成功,要么都失败
- 一致性(Consistency) 一个事务执行会使数据从一个一致性状态切换到另一个一致性状态,执行前后保证数据的完整性是一致的!
- 隔离性(Islation) 多个用户并发访问数据库要相互隔离!事务之间不能相互干扰;
- 持久性(Durability) 事务一旦被提交,这条记录才会被真正的修改,他对数据的改变是永久性的
# 开启事务
set autocommit=0;
START TRANSACTION;
语句1;
语句2;
# 提交
COMMIT;
# 回滚事务
ROLLBACK;
事务的隔离级别
同时运行多个事务,多个事务访问同一数据资源,如果没有采取必要的隔离级别,就会导致各种并发问题:
- 脏读:针对修改;对于两个事务T1、T2 , T1 读取了被 T2 更新但是还没有被提交的数据后,若 T2 回滚,那么 T1 读取的内容就是临时且无效的;---事务2读取了事务1未提交的数据;
- 不可重复读: 对于两个事务T1、T2, T1读取了数据,然后 T2 更新了数据提交之后, T1再读取同一个字段,值就不同了;在同一个事物中多次查询未修改到的数据应该一致, ---事务2第一次读取的数据和第二次读取的数据因为事务1的修改导致不一致
- 幻读: 针对新增;对于两个事务T1、T2, T1从表中读取一个数据,然后T2在该表中插入了一条数据,如果T1再次读取,同一个表,就会多出一行 -- 事务2第二次读取的数据因为事务1的新增操作比第一次读取得数据多了几条;
设置数据库隔离级别、mysql 支持4中隔离级别
mysql 5.7查询数据库默认使用的隔离级别
select @@tx_isolation;
mysql 8 中的查询数据库默认使用的隔离级别
select @@transaction_isolation;
REPEATABLE READ: 可重复读取,可以确保事务从一个字段读取相同的值,在这个事务的持续期间,禁止其他事务对这个字段进行更新,可以避免脏读,和不可重复读,但幻读的问题仍然存在.
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
READ UNCOMMTTED 读未提交 允许事务读取未被其他事物提交的变更,脏读,不可重复读和幻读的问题都会出现
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
READ COMMTED 读已提交数据 只允许事务读取已经被其他事务提交的变更,可避免脏读但是,不可重复读和幻读仍然可能出现
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
SERIALIZABLE 串行化 确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入,更新和删除操作,所有并发问题都能避免,但性能低下;
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
测试:
以管理员身份开启两个cmd命令行界面,连接同一个数据库
开启两个命令行模拟两个事务
设置为 READ UNCOMMTTED 读未提交
脏读不可重复读、幻读不可避免
设置为 READ COMMITTED 读以提交
避免了脏读,不可重复读和幻读,还是会出现;
REPEATABLE READ 可重复读取
避免了,脏读和不可重复读,幻读不能解决
幻读
SERIALIZABLE 串行化
删除操作
delete 支持事务的回滚;
TRUNCATE不支持事务的回滚;