您的位置:首页 > 数据库 > MySQL

MySQL事务和隔离级别

2016-10-06 23:36 981 查看
广义查询:
delete:
insert into:
update:

insert into TB_NAME (COL1, COL2,...)values (VAL1,VAL2,...)[,(VAL1,VAL2,...),...]
字符型:单引号
数值型:不需要引号
日期时间型:不需要引号
空值:NULL,需要单引号

mysql> help insert

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name [(col_name,...)]
{VALUES | VALUE} ({expr | DEFAULT},...),(...),...
[ ON DUPLICATE KEY UPDATE
col_name=expr
[, col_name=expr] ... ]

Or:

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
SET col_name={expr | DEFAULT}, ...
[ ON DUPLICATE KEY UPDATE
col_name=expr
[, col_name=expr] ... ]

Or:

INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name [(col_name,...)]
SELECT ...
[ ON DUPLICATE KEY UPDATE
col_name=expr
[, col_name=expr] ... ]

insert into tutors (tname,gender,age) value ('tom','f',30);
insert into tutors set tname='tom', gender='f',age=30;
insert into tutors (tname.gender,age) select name,gender,age from students where age > 20;

查看表里的最后一个数据,先降序排序,然后只显示第一个
select * from tutors order by TID desc limit 1;

select last_insert_id(); 此函数为表的计数函数,即把表清空后再插入也是从之前的行数+1开始插入

replace 插入的时候判断数据是否存在,如果存在则不插入
mysql> help replace

REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name [(col_name,...)]
{VALUES | VALUE} ({expr | DEFAULT},...),(...),...

Or:

REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name
SET col_name={expr | DEFAULT}, ...

Or:

REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name [(col_name,...)]
SELECT ...

delete: mysql> help delete

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]

truncate TB_NAME 清楚表里的数据并重置计数器

update:
mysql> help update

UPDATE [LOW_PRIORITY] [IGNORE] table_reference
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]

Multiple-table syntax:

UPDATE [LOW_PRIORITY] [IGNORE] table_references
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]

update TB_NAME set COL1=...,COL2=... where

连接管理器:
接受请求
创建线程
认证用户
建立安全连接
并发控制:
多版本并发控制:MVCC。通过快照和时间点来管理

锁:
读锁:共享锁
写锁:独占锁
mysql> help lock
Name: 'LOCK'
LOCK TABLES
tbl_name [[AS] alias] lock_type
[, tbl_name [[AS] alias] lock_type] ...

lock_type:
READ [LOCAL]
| [LOW_PRIORITY] WRITE

UNLOCK TABLES

lock tables TBNAME {read|write};
unlock tables 解锁锁

锁粒度:从大到小,mysql服务器仅支持表级锁,行锁需要由存储引擎完成:
表锁:
行锁:
页锁:

多事务同时执行:彼此之间互不影响的方式进行;
事务之间交互:
通过数据集
事务:
RDBMS:
ACID
Automicity:原子性,
Consistency:一致性,
Isolation隔离性,
事务调度:事务之间影响最小
MVCC:多版本并发控制
Durability:持久性,一旦事务成功完成,系统必须保证任何故障都不会引起事务表现出不一致性
1.事务提交之前就已经写出数据至持久性存储
2.结合事务日志完成:
事务日志:顺序IO
数据文件:随机IO

事务的状态:
活动的active
部分提交的: 最后一条语句执行后
失败的:
中止的:
提交的:

事务:并发执行
1。提高吞吐量和资源利用率
2。减少等待时间

事务调度
可恢复调度
无级联调度

MyISAM
Innodb

隔离性:
隔离级别:
READ UNCOMMITTED 读未提交
READ COMMITTED 读提交
REPATABLEREAD 可重读
SERIABLIZABLE 可串行

并发控制依赖的技术手段

事件戳
多版本和快照隔离

饿死:
死锁:

mysql> show global variables like '%iso%'; 默认的隔离级别
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| tx_isolation | REPEATABLE-READ |
+---------------+-----------------+
1 row in set (0.00 sec)
修改: set {session|global} var_name='';

mysql> set tx_isolation ='read-uncommitted';

mysql> show variables like '%iso%';
+---------------+------------------+
| Variable_name | Value |
+---------------+------------------+
| tx_isolation | READ-UNCOMMITTED |
+---------------+------------------+

select @@tx_isolation
set tx_isolation ='READ-UNCOMMITTED';

SQL,ODBC

START TANSACTION:启动
SQL
SQL
COMMIT:提交
ROLLBACK:回滚

mysql> start transaction; 启动事务
mysql> rollback;回滚事务
mysql> commit 提交事务

select @@autocommit; 查看是否开启自动提交1代表开启,开启后只要没手动系统事务就直接提交,无法撤回
set @@autocommit 0; 手动设置

savepoint NAME; 保存点

savepoint to NAME; 回滚到保存点
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MySQL 事务 隔离级别