数据库难点:事务
事务是由一组sql语句组成的执行单元,这些sql之间一般都互相依赖。
如A给B转账
1.update 表 set money = money-1000 where id=1
2.update 表 set money = money+1000 where id=2
以上两句sql组成了一个转账的事务。一个事务要么全部执行,要么全部不执行。
事务的特性ACID
Atomicity原子性
事务是最小的执行单元,要么全部执行,要么全部不执行。
Consistency一致性
事务执行前后,必须让所有数据保持一致状态。(总体数据守恒)
create view 视图名 as
查询的sql语句;
select * from 视图名;
drop view 视图名;
Isolation隔离性
多个事务并发执行时应该互相隔离,互不影响。
Durability持久性
事务一旦提交,对数据的改变是永久的。
手动提交/回滚事务
1.关闭事务自动提交:set @@autocommit=0
2.开启事务:start transaction
3.事务要执行的sql
4.没有提交之前,可以使用rollback回滚
5.如果要提交,使用commit,一旦提交成功,无法rollback
事务并发可能出现的问题:脏读、不可重复读、幻读
脏读:事务A读取到了事务B未提交的数据
不可重复读:事务A中如果要读取两次数据,在这期间,事务B对数据进行了修改并提交,导致事务A读取两次的情况不一致
幻读:事务A读取id为1-10之间的数据,假如只有id为2和5的数据,在读取期间,事务B添加了
一条id为3的数据,导致事务A多读取到了事务B中的数据。
事务的隔离级别:
read uncommitted:会出现脏读、会出现不可重复读、会出现幻读
read committed:不会出现脏读、会出现不可重复读、会出现幻读
repeatable read:不会出现脏读、不会出现不可重复读、会出现幻读
serializable:不会出现脏读、不会出现不可重复读、不会出现幻读。
查看事务隔离级别:select @@transaction_isolation
设置事务隔离级别:set [session|global] transaction isolation level [Read Uncommitted|Read
Committed|Repeatable Read|Serializable]