插入
insert into 表名(字段,字段,字段...) values(对应的值,值,值...);
insert into 表名 values(完整字段值),(完整字段值)......;
修改
update 表名 set 字段名=...... where ......
删除
delet from 表名 where......
MySQL事务
事务是一个完整的业务逻辑单元,不可再分
保证几个DML语句要么同时成功要么同时失败
原子性(Atomicity):整个事务的全部操作,必须作为一个单元全部完成(或全部取消)事务是最小的工作单元,不可再分
一致性(Consistency):在事务开始之前与结束之后,数据库都保持一致状态
隔离性(Isolation):一个事务不会影响其他事务的运行
持久性(Durability):事务必须持久到硬盘上,才算一个事务成功的结束
隔离性
四大隔离级别:
- 读未提交(read uncommited)
对方事务还没有提交,我们当前事务可以读取到对方未提交的数据。
读未提交存在脏读(Dirty Read)现象:表示读到了脏的数据
根本没有在硬盘文件,在缓存,是不稳定的 - 2档:读已提交(read commited)
对方事务提交之后的数据我方可以读取到。
读已提交存在的问题是:不可重复读 (解决了脏读现象) - 可重复读(repeatable read)
这种隔离级别解决了:不可重复读问题
对方提交了,我也读不到
读到的数据是幻象 - 序列化读 / 串行化读(serializabel)
解决了所有问题,效率低,需要排队
数据库一般都是都是3档或2档起步
MySQL是**可重复读(3档)起步,Oracle是读已提交(2档)**起步
MySQL默认自动提交,怎么关闭?
start transaction;
drop table if exists t_user
create table t_user(
id int primary key auto increment,
username varchar(255)
) ;
start tansaction;(开启事务)
insert into t_user(username) values('lisi');
rollback;(commit;)
设置隔离级别:
set global transaction isolation level read uncommited;(设置完退一下)
如何查看隔离级别:
select @@global.tx_isolation;
比如同时开启两个mysql:一个开启了事务但是还没提交
另一边mysql 用select 语句能查到改的数据(脏读)
set global transaction isolation level read commited;
则必须事务结束才能读到数据
set global transaction isolation level repeatable read
则其中一个mysql开启了事务,另外一个mysql结束了事务
但是因为第一个mysql事务没有结束,所以select 的表
和之前的一样。
set global transaction isolation level serializable;
则必须一边事务结束,另一个事务才可以进行,否则就卡住
每次设置完事务隔离级别exit再重新连接