*数据库事务的想关操作
1.事务开始:开始是一个事物,作为回滚的标记
2,回滚 rollback :回滚到上一个事务开始的地方,
或者回滚到某个存档点,期间没被 commit ; 操作都会被撤回
3.提交commit ;将事务中所有操作提交到数据库中
4.存档点:设置存档点方便回滚

*开始事务
........确认一个起点
begin 或 start transaction ;#两种都可以

begin ;

update account set money=money-1000 where id=2;
update account set money=money+1000 where id=1;

select *from account;

#提交事务结果
commit ;

回滚:在未提交到数据库时,可回滚到上次提交数据后

begin ;
update account set money=money-1000 where id=2;
update account set money=money+1000 where id=1;
select *from account;
#回滚
rollback ;#后悔

多条数据

begin ;
insert into account(name, money) values ('zhaoliu',2000);

#存档
savepoint suibian;

update account set money=money-1000 where id=2;
update account set money=money+1000 where id=1;

select *from account;

rollback to suibian;

commit ;

*数据库事务的4个特性(ACID)
1.原子性( atomicity )
事务包含的所有操作,要么全部成功,要么全部失败
2,一致性( Consistency )(快照读)
事务必须使数据库从一个一致性状态到另一个一致性状态
3.隔离性( isolation )
如果有多个用户并发访问数据库,数据库的每个用户开始事务
不能被其他事物的操作干扰,多个并发事务之间应当保持相互隔离
4.持久性( Durability
事务的操作,一旦被提交,对于数据库的改变是永久的
即使数据库发生故障,也不能丢失已提交的数据/完成的改变

*三个隔离性问题
1.脏读
一个事务读取了未提交事务执行过程中的数据
2.不可重复读
对于数据库中的莫个数据,一个事务执行过程中多次查询返回不同结果,
3,幻读(虚读
对于一个事务,批量修改数据的时候,另一个事物插入一条新数据
在第一个事务中,执行了操作却没有将所有情况数据进行修改

*4个隔离级别
1 RU (Read Uncommitted
读取未提交内容,所有的事务都可以看到其他事务未提交内容
2,RC (Read Committed
读取提交内容,可以避免脏读,但是无法避免不可重复读和幻读
3 RR (Repeatable Read
可重复复读,MYSQL默认的隔离级别,可以避免脏读和不可重复读
但不能避免幻读,通过Innodb引擎版本并发控制来避免幻读
4 ,Serializable 串行化
最高隔离级别,强制所有事务排序执行,
性能会出现问题,会出现大量的超时和锁竞争现象

*隔离级别的实现
1,读锁和写锁
共享锁:数据库的读锁,一旦加上该锁,其他用户只能读不能写
排它锁 : 写锁, 一旦给表或行加上写锁,其他用户既不能读也不能写

2,行锁和表锁

*数据库设计3大范式
范式顺序
1 2 3 bc 4 //范式都是依赖关系

第一范式
数据库表的每一列都是不能继续拆分的最小单元

第二范式
满足INF,表中的每一列都必须依赖主键
一个表只描述一个事

第三范式
满足2NF,表中所有的列至于主键直接相关,而不是间接相关

第一范式:列不能拆分
第二范式:每个表只能描述一个事
第三范式:使用外键做表之间的关联

posted on 2019-05-28 17:04  脑抽不要停  阅读(125)  评论(0编辑  收藏  举报