Maison > Article > base de données > Cours MySQL 4 : Déclaration de contrôle des transactions TCL
Recommandation d'apprentissage gratuite : Tutoriel vidéo MySQL
Répertoire d'articles
, parmi lesquels prend en charge les transactions, tandis que ,
, etc. ne prennent pas en charge transactions.show engines;
Transaction : Une ou un groupe d'instructions SQL forment une unité SQL, cette unité d'exécution innodb
. myisam
memory
Les transactions ont
Atomicité | La transaction est une unité divisée non transactionnelle de work | ||||||||
---|---|---|---|---|---|---|---|---|---|
要么全部都执行,要么全部都不执行 Cohérence |
Les transactions doivent faire passer la base de données d'un état de cohérence à un autre état de cohérence |
||||||||
Isolement
|
L'exécution d'une transaction ne peut être interférée par d'autres transactions, et les transactions exécutées simultanément ne peuvent pas interférer les unes avec les autres |
||||||||
Durabilité (Durabilité) | Une fois la transaction terminée validées, les modifications apportées aux données dans la base de données sont permanentes |
: les transactions n'ont pas de début ni de fin évidents marques, telles que les instructions d'insertion, de suppression et de mise à jour.
Transaction explicite : La transaction présente des marques d'ouverture et de fermeture évidentes. La condition préalable à l'utilisation est que la fonction de validation automatique doit d'abord être désactivée.
Une fois l'instruction DELETE annulée, elle peut toujours être restaurée ; une fois l'instruction TRUNCATE annulée, elle ne peut pas être restaurée.
【演示事务的使用步骤 】DROP TABLE IF EXISTS account;CREATE TABLE account( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(20), balance DOUBLE);INSERT INTO account(username,balance)VALUES('张无忌',1000),('赵敏',1000);# 第一步:关闭自动提交SET autocommit=0;START TRANSACTION;# 可以省略# 第二步:编写一组事务UPDATE account SET balance=balance+500 WHERE username='张无忌';UPDATE account SET balance=balance-500 WHERE username='赵敏';# 第三步:结束事务#commit;# 提交ROLLBACK; # 回滚SELECT * FROM account;【演示savepoint的使用】SET autocommit=0;START TRANSACTION;DELETE FROM account WHERE id=1;SAVEPOINT a;# 设置保存点DELETE FROM account WHERE id=2;ROLLBACK TO a; # 回滚到保存点
2. Problèmes et solutions de concurrence des transactions 脏读
更新但没有提交
Pour plusieurs transactions exécutées en même temps, lorsque ces transactions accèdent aux mêmes données dans la base de données, si aucune étape nécessaire sont prises Le mécanisme d'isolement entraînera divers problèmes de concurrence.
不可重复读
: Une transaction lit les données d'autres choses .
幻读
插入但没有提交
: Une transaction est lue plusieurs fois et les résultats sont différents.
: Une transaction lit les données d'autres transactions
.@@tx_isolation
La solution aux problèmes de concurrence des transactions est d'éviter les problèmes de concurrence en définissant le niveau d'isolement des transactions. select @@tx_isolation;
事务的隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
read uncommitted 读未提交 | 未解决 | 未解决 | 未解决 |
read committed 读已提交(Oracle默认) | 解决√ | 未解决 | 未解决 |
repeatable read 可重复度(Mysql默认) | 解决√ | 解决√ | 未解决 |
serializable 串行化 | 解决√ | 解决√ | 解决√ |
, indiquant le niveau d'isolation actuel des transactions. read committed
Afficher le niveau d'isolement actuel :
Niveau d'isolement de la transaction | Lecture sale th> | Lecture non répétable | Lecture fantôme |
---|---|---|---|
lecture non validée lecture non validéeglobal Non résolu |
Non résolu |
Non résolu | |
lecture validée lecture validée (Oracle Default) | Résolu√ | Non résolu | Non résolu |
répétabilité de lecture répétable (Mysql par défaut) |
Résolu√ | Résolu√ | Non résolu |
Résolu√ | Résolu√ | Résolu√ |
Définir l'isolation niveau de la connexion mysql actuelle :
définir le niveau d'isolement des transactions;
视图和表的对比 | 创建语法的关键字 | 占用的物理空间 | 使用 |
---|---|---|---|
视图 | create view | 只是保存了sql逻辑 | 可以增删改查,但一般只支持查询 |
表 | create table | 保存了数据 | 支持增删改查 |
视图创建语法:
create view 视图名
as(查询语句);
视图修改语法:
方式一:create or replace view 视图名
as (新的查询语句);
方式二:alter view 视图名
as(新的查询语句);’
视图删除语法:DROP VIEW 视图名,视图名...;
视图的更新:
视图的可更新性和视图中查询的定义有关系,以下类型的视图不能更新。
视图的优点:
【视图的创建】# 1.查询邮箱中包含a字符的员工名、部门名、工种名CREATE VIEW myv1 # 将三个表的连接封装AS ( SELECT Last_name,department_name,job_title FROM employees e JOIN departments d ON e.department_id=d.department_id JOIN jobs j ON j.job_id=e.job_id);SELECT * FROM myv1 WHERE Last_name LIKE '%a%';# 2.查询各部门的平均工资级别CREATE VIEW myv2 # 各部门平均工资和部门idAS( SELECT AVG(Salary) ag,department_id FROM employees GROUP BY department_id);SELECT myv2.ag,grade_levelFROM myv2JOIN job_grades jON myv2.ag BETWEEN j.lowest_sal AND j.highest_sal;# 3.查询平均工资最低的部门id和平均工资SELECT * FROM myv2 ORDER BY ag LIMIT 1;# 4.查询平均工资最低的部门名和工资CREATE VIEW myv3 AS( SELECT * FROM myv2 ORDER BY ag LIMIT 1);SELECT department_name,agFROM departmentsJOIN myv3ON myv3.department_id=departments.department_id;------------------------------------------------------------------------------------------【视图的修改】# 方式一:CREATE OR REPLACE VIEW myv3AS( SELECT AVG(Salary),job_id FROM employees GROUP BY job_id);# 方式二:ALTER VIEW myv3AS(SELECT * FROM employees);SELECT * FROM myv3;------------------------------------------------------------------------------------------【视图的删除】DESC myv1;# 查看视图SHOW CREATE VIEW myv1;# 查看视图DROP VIEW myv1,myv2,myv3; # 删除视图------------------------------------------------------------------------------------------【视图的更新】CREATE OR REPLACE VIEW myv4AS( SELECT Last_name,email FROM employees);# 1.插入INSERT INTO myv4 VALUES('花花','huahua@163.com');SELECT * FROM myv4;SELECT * FROM employees;# 2.修改UPDATE myv4 SET Last_name='Hudie' WHERE Last_name='花花';# 3.删除DELETE FROM myv4 WHERE Last_name='Hudie';
学习了MySQL的视图,尝试完成下列习题
答案:一、
CREATE OR REPLACE VIEW emp_v1
AS(
SELECT Last_name,Salary,email
FROM employees
WHERE phone_number LIKE ‘011%’
);
SELECT * FROM emp_v1;二、
ALTER VIEW emp_v1
AS(
SELECT Last_name,Salary,email
FROM employees
WHERE phone_number LIKE ‘011%’ AND email LIKE ‘%e%’
);三、
CREATE OR REPLACE VIEW emp_v2 # 部门最高工资高于12000的部门id、部门最高工资
AS(
SELECT MAX(Salary) mx,department_id
FROM employees
GROUP BY department_id
HAVING MAX(Salary)>12000
);
SELECT d.*,m.mx
FROM departments d
JOIN emp_v2 m
ON m.department_id=d.department_id;四、
CREATE TABLE Book(
bid INT PRIMARY KEY,
bname VARCHAR(20) UNIQUE NOT NULL,
price FLOAT DEFAULT 10,
btypeId INT,
FOREIGN KEY(byteId) REFERENCES bookType(id)
);五、
SET autocommit=0;
INSERT INTO book(bid,bname,price.btypeId) VALUES(1,‘大败局’,100,1);
COMMIT;六、
CREATE VIEW myv1
AS(
SELECT bname,NAME
FROM book b
JOIN bookType t
ON b.btypeid=t.id
WHERE price>100
);七、
CREATE OR REPLACE VIEW myv1(
SELECT bname,price
FROM book
WHERE price BETWEEN 90 AND 120
);八、
DROP VIEW myv1;
更多相关免费学习推荐:mysql教程(视频)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!