文章目录
- MySQL事务(Java线程)
- 一、事务简介
- 二、关于事务的命令
- 开启事务
- 提交事务
- 回滚事务
- 查看事务提交方式
- 修改事务提交方式
- 三、事务案例
- 四、事务四大特征(ACID)(MySQL面试必问)
- 五、并发事务问题
- 六、事务隔离级别
- 七、查看事务隔离级别
- 八、设置事务隔离级别
MySQL事务(Java线程)
一、事务简介
- 数据库事务是一种机制、一种操作序列,包含一组数据库操作命令。
- 事务把所有命令作为一个整体,同时向系统提交或撤销操作请求。即这一组数据库命令要么同时成功,要么同时失败。
- 事务是数据库操作的最小逻辑单元。
二、关于事务的命令
开启事务
-- START TRANSACTION;
BEGIN;
提交事务
COMMIT;
回滚事务
ROLLBACK;
查看事务提交方式
-- 默认是自动提交
-- 1.自动提交 0.手动提交
select @@autocommit;
修改事务提交方式
-- 修改事务提交方式为手动提交
set@@autocommit = 0;
三、事务案例
-- 创建一个account表
DROP TABLE if EXISTS account;
CREATE TABLE account(
id INT PRIMARY KEY auto_increment,
name varchar(10),
money double(10,2)
);
-- 插入两条数据
INSERT INTO account(name, money) values ('张三', 1000),('李四', 1000);
-- 转账操作
-- 1. 查询李四账户金额是否大于500
select * from account where name = '李四';
-- 2. 李四账户 -500
UPDATE account set money = 500 where name = '李四';
-- 出现异常了...
-- 3. 张三账户 +500
UPDATE account set money = 1500 where name = '张三';
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;
-- 转账出现异常的时候,可以使用rollback回滚事务,避免资金出现异常
四、事务四大特征(ACID)(MySQL面试必问)
- 原子性(atomicity):事务是逻辑上不可分割的最小操作单位,要么同时成功,要么同时失败,对于一个事务来说不可能只执行其中的一部分
原子性描述的是事务本身是最小的工作单元。
- 一致性(consistency):事务完成时,必须使所有的数据都保持一致状态
一致性描述的是事务完成之后数据的状态,需要保持一致,可以认为原子性是因,一致性是果
- 隔离性(isolation):针对事务并发,隔离性就是要隔离并发运行的多个事务之间的相互影响,一般来说一个事务所做的修改在最终提交前,对其他事务是不可见的。
例如在Navicat和cmd中同时开启事务,先在Navicat中李四向张三转账500,查询结果,转账成功。此时,在cmd中,李四再向张三转账500,则会提示error,事务之间互相影响的程度就叫事务的隔离性。
- 持久性(durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的,此时即使系统崩溃,修改的数据也不会丢失
五、并发事务问题
- 脏读:一个事务读到另一个事务还没有提交的数据
比如B读到了A未提交的数据。
- 不可重复读:一个事务先后读取同一条记录,但是两次读取的数据不同,称之为不可重复读
事务A两次读取同一条记录,但是读到的数据却是不一样的。
- 幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了"幻影"。
六、事务隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
Read uncommitted 未提交读 | √ | √ | √ |
Read committed 已提交读 | × | √ | √ |
Repeatable Read(默认) 可重复读 | × | × | √ |
Serializable 可串行化 | × | × | × |
七、查看事务隔离级别
-- 查看事务隔离级别 (mysql 默认是可重复读)
SELECT @@TRANSACTION_ISOLATION;
八、设置事务隔离级别
-- SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED |
-- READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ ;
注意:事务隔离级别越高,数据越安全,但是性能越低。