含义
事务:一条或多条sql语句组成一个执行单位,一组sql语句要么都执行要么都不执行。
特点(ACID)
- 原子性(Atomicity):一个事务是不可再分割的整体,要么都执行要么都不执行。
- 一致性(Consistency):一个事务可以使数据从一个一致状态切换到另外一个一致的状态。
- 隔离性(Isolation):一个事务不受其他事务的干扰,多个事务互相隔离的。
- 持久性(Durability):一个事务一旦提交了,则永久的持久化到本地。
事务使用步骤
隐式事务:事务没有明显的开启和结束的标志,如insert,update,delete语句
显式事务:具有明显的开启和结束的标志
1.开启事务
必须先设置自动提交功能为禁用
注意:只针对当前事务有效,并不是永久性的。
set autocommit = 0;
# 之后可以查看自动提交功能状态(可选)
show variables like "autocommit";
# 开启事务(可选)
start transaction;
2.编写一组sql语句,设置回滚点
语句1(select,insert,update,delete);
语句2;
...
savepoint 回滚点名;
...
3.结束事务
commit; # 提交事务
rollback to 回滚名;/rollback; # 回滚事务
演示案例
create database if not exists test;
use test;
create table if not exists account(
id int primary key auto_increment,
username varchar(20),
balance double
);
insert into account(username,balance) values('张无忌',1000),("赵敏",500);
# 1.开启事务
set autocommit = 0;
start transaction;
# 2.编写一组语句
update account set balance = 500 where username='张无忌';
update account set balance = 1500 where username='赵敏';
# 3.结束事务
# 提交
commit;
# 也可以回滚
rollback;
事务并发问题
1、如何发生的
多个事务 同时 操作 同一个数据库的相同数据时
2、并发问题都有哪些
- 脏读:一个事务读取了其他事务还没有提交的数据,读到的是其他事务“更新”的数据
- 不可重复读:一个事务多次读取,结果不一样
- 幻读:一个事务读取了其他事务还没有提交的数据,只是读到的是 其他事务“插入”的数据
3.如何解决并发问题
方法:设置隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
read uncommitted:读未提交 | × | × | × |
read committed:读已提交 | √ | × | × |
repeatable read:可重复读 | √ | √ | × |
serializable:串行化 | √ | √ | √ |
mysql 中默认第三个隔离级别 repeatable read
oracle 中默认第二个隔离级别 read committed
查看隔离级别
select @@tx_isolation;
设置隔离级别
set session/global tansaction isolation level 隔离级别;
delete 和 truncate在事务使用时的区别
create database if not exists test;
use test;
create table if not exists account(
id int primary key auto_increment,
username varchar(20),
balance double
);
insert into account(username,balance) values('张无忌',1000),("赵敏",500);
# 演示delete
set autocommit=0;
start transaction;
delete from account;
rollback;
select * from account; # 有记录
# 演示truncate
set autocommit=0;
start transaction;
truncate account;
rollback;
select * from account; # 无记录
如果有其他问题欢迎留言或邮件提问
QQ:1269112498
Email:1269112498@qq.com
相关文章