/*
事务:
由单独单元的一个或多个SQL语句组成,
在这个单元中,每个SQL语句是相互依靠的。而整个单独单元作为一个不可分割的整体,
如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回滚。
所有受影响的数据降返回到事务开始以前的状态;
如果单元中的所有SQL语句均执行成功,则事务被顺利执行
事务的acid属性:
1.原子性(atomicity)
事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
2.一致性(consistency)
事务必须使数据库从一个一致性状态发展到另外一个一致性状态
3.隔离性(isolation)
一个事务的执行不能被其他事务干扰,
即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,
并发执行的各个事务之间不能互相干扰
4. 持久性(durablity)
一个事务一旦被提交,它对数据库中数据的改变就是永久性的
接下来的其他操作和数据库故障不应该对其有任何影响
常见的并发问题:
对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题
脏读:
对于两个事务T1,T2,T1读取了已经被T2更新但还没有提交的字段之后,若T2回滚,T1读取到的内容就是临时且无效的
不可重复读:
对于两个事务T1,T2,T1读取了一个字段,然后T2更新了该字段之后,T1再次读取同一个字段,值就不同了
幻读:
对于两个事务T1,T2,T1从一个表中读取了一个字段,然后在该表中插入了一些新的行,
之后,如果T1再次读取同一个表,就会多出几行
事务隔离级别:
脏读 幻读 不可重复读
read uncommitted √ √ √
read committed × √ √ (oracle)
repeatable read × × √ (mysql默认)
serializable × × ×
隔离级别:
每启动一个mysql程序,就会获得一个单独的数据库连接,每个数据库连接都有一个全局变量@@tx_isolation,表示当前的事务隔离级别
查看当前的事务隔离级别:
SELECT @@tx_isolation;
设置当前mysql连接的隔离级别:有4种
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
设置数据库系统的全局的隔离级别:
set global transaction isolation level read committed;
存储引擎:
查看: show engines;
在mysql中用的最多的存储引擎有:innodb,myisam,memory等
其中innodb支持事务
事务创建:
隐式事务:事务没有明显的开启和结束的标记
比如 insert update delete
显式事务:事务具有明显的开启和结束的标记
前提:必须先设置自动提交功能为禁用状态
SHOW VARIABLES LIKE '%autocommit%'
set autocommit = 0; # 只针对当前会话有效
步骤:
1.开启事务
set autocommit = 0;
start transaction; # 可选
2.编写事务中的sql语句(select insert update delete)
语句1;
语句2;
3.结束事务
commit;#提交事务
rollback;#回滚事务
savepoint; 设置保存点
*/
SHOW ENGINES;
SHOW VARIABLES LIKE '%autocommit%'
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 = 1000 WHERE username = '张无忌';
UPDATE account SET balance = 1000 WHERE username = '赵敏';
ROLLBACK;
COMMIT;
SELECT * FROM account;
SELECT @@tx_isolation;
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
#savepoint
SET autocommit=0;
START TRANSACTION;
DELETE FROM account WHERE id=25;
SAVEPOINT a;#设置保存点
DELETE FROM account WHERE id=28;
ROLLBACK TO a; #回滚到保存点
#delete 和 truncate在事务使用时的区别
#delete
SET autocommit = 0;
START TRANSACTION;
DELETE FROM account;
ROLLBACK; #可回滚成功
#truncate
SET autocommit = 0;
START TRANSACTION;
TRUNCATE FROM account;
ROLLBACK; #回滚失败
网友评论