sql1复习笔记12
1.连接查询-mysql不支持fulljoin
用左连接和右连接通过union连接上
select * from person left join card on person.cardId=card.id
union
select * from person right join card on person.cardId=card.id;
连接的好处就是不用创建外键。
2.事务-事务用来做什么?
mysql事务:
事务其实是一个最小的不可分割的工作单元。事务能够保证一个业务的完整性。
比如我们的银行转账:
a→-100
update user set money=money-100 where name='a';
b→+100
update user set money=money+100 where name='b';
在实际的程序中,如果只有一条执行成功,而另外一条没有执行成功,就会出现数据前后不一致。
事务要解决的问题:
多条sql语句,可能会有同时成功的要求,要么就同时失败。
3.事务-如何控制事务commit_rollback
mysql中如何控制事务?
- mysql默认是开启事务的。(自动提交)
mysql> select @@autocommit;
默认事务开启的作用是?
当我们去执行一个sql语句的时候,效果会立即体现出来,且不能回滚。
create database bank;
use bank;
create table user1(
id int primary key,
name varchar(20),
money decimal
);
insert into user1 value(1,'a',1000);
--事务回滚:撤销sql语句执行效果
rollback;
--能回滚的办法:设置默认事务为0(mysql自动提交为false)
set autocommit = 0;
insert into user1 value(2,'b',2000);
rollback;
--因为b的输入没有提交,显示的是一个复制表,如果想让b提交为真表:
commit;
//一旦提交是不可回滚的
事务有两个:
自动提交:autocommit=1;
手动提交:手动输入commit;
回滚:rollback。
如果说这个时候转账:
update user1 set money=money-100 where name='a';
update user1 set money=money+100 where name='b';
rollback;
事务给我们提供了一个反悔的机会。
4.事务-手动开启事务begin_start_transaction
set @@autocommit=1;
//现在不能rollback了,如果还是想rollback,可以用:
begin;start transaction
//这两个语句都可以帮我们手动开启一个事务。
update user1 set money=money-100 where name='a';
update user1 set money=money+100 where name='b';
rollback;
//设置完此时不能回滚
//(1)
begin;
update user1 set money=money-100 where name='a';
update user1 set money=money+100 where name='b';
rollback;
//(2)
start transaction;
update user1 set money=money-100 where name='a';
update user1 set money=money+100 where name='b';
rollback;
回滚之后再回滚还能回滚,怎么办?commit。
5.事务-ACID特征与使用
以上主要是讲一致性。
事务的四大特征:
A:原子性,Atomicity。事务是最小的单位,不可以再分割;
C:一致性,consistency。事务要求,同一事务中的sql语句,必须保证同时成功或者失败;
I:隔离性,isolated。事务1和事务2之间是具有隔离性的;
D:持久性,durable。事务一旦结束,就不可更改。
事务开启方式:
- 修改默认提交 set autocommit=0;
- begin;
- start transaction。
事务提交方式:
- 手动commit;
- rollback。