#事务
transaction control language 事务控制语言
概念:由一条或多条sql语句组成,要么都成功,要么都失败
事务的ACID属性:
1、原子性A
2、一致性C
3、隔离性I
4、持久性D
分类:
隐式事务:没有明显的开启和结束标记
比如DML中的insert,update,delete语句本身就是一条事务
显式事务:具有明显的开启和结束标记
一般是由多条SQL语句组成,必须具有明显的开启和结束标记
步骤:
前提:取消隐式事务自动开启的功能
1、开启事务
2、编写事务需要的sql语句(1条或多条)
3、结束事务
commit;//提交
rollback;//回滚事务
savepoint 节点名;//设置保存点
SHOW VARIABLES LIKE '%auto%';-- 查看系统变量
#事务的使用步骤
#1、取消事务自动开启
SET autocommit = 0;
#2、开启事务
START TRANSACTION;
#3、编写事务的sql语句
UPDATE stuinfo SET balance = balance - 5000 WHERE id = 1000;
UPDATE stuinfo SET balance = balance + 5000 WHERE id = 1001;
#4、结束事务
#提交
COMMIT;
#回滚
ROLLBACK;
#演示savepoint的使用
SET autocommit = 0;
START TRANSACTION;
DELETE FROM account WHERE id = 1000;
SAVEPOINT a;#设置保存点
DELETE FROM account WHERE id = 2;
ROLLBACK TO a;#回滚到保存点
-- 1000删了,2没删,保存点只搭配回滚使用。
#存储引擎:
概念:在mysql中的数据用各种不同的技术存储在文件(或内存)中。
查看mysql支持的存储引擎:show engines;
mysql中用的最多的存储引擎有:innodb,myisam,memory等,其中innodb支持事务,而myisam,memory等不支持事务。
事务并发问题:
*同时运行多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题。
并发问题:
1、脏读:两个事务T1,T2,T1读取了已经被T2更新但还没有提交的数据之后,若T2回滚,T1读取的内容就是临时且无效的。
2、不可重复读:两个事务T1,T2,T1读取了一个字段,然后T2更新了这个字段,T1再次读取同一个字段,值就不同了。
3、幻读:两个事务T1,T2,T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行,提交之后,如果T1再次读取同一个表,就会多出几行。
脏读和幻读都是一个事务读取,另一个事物还没有提交出现的问题,只不过脏读侧重于更新,幻读侧重于插入。
*******我们可以通过设置隔离级别来避免这些并发问题的发生。
*数据库提供四种隔离级别:
1、read uncommited 读未提交数据,会出现脏读、幻读、不可重复读。
2、read commited 读已提交数据:可以避免脏读,不能避免不可重复读和幻读。
3、repeatable read 可重复读:可以避免脏读和不可重复读,不能避免幻读。
4、serializable 串行化:可以避免脏读、不可重复读、幻读,但是性能低下。
*Oracle支持read commited和seriliazable,默认为read commited.
*mysql支持4种事务隔离级别,默认为repeatable read.
查看当前隔离级别(cmd):select @@tx_isolation;
设置隔离级别(cmd):set session transaction isolation level read uncommitted;//只针对当前连接用户有效
设置数据库系统的全局的隔离级别:set global transaction isolation level read committed;//针对所有连接用户都有效