文章目录

  • 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):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的,此时即使系统崩溃,修改的数据也不会丢失

五、并发事务问题

  • 脏读一个事务读到另一个事务还没有提交的数据

mysql 开启事务命令 mysql怎么开启事务_java

比如B读到了A未提交的数据。

  • 不可重复读一个事务先后读取同一条记录,但是两次读取的数据不同,称之为不可重复读

mysql 开启事务命令 mysql怎么开启事务_java_02

事务A两次读取同一条记录,但是读到的数据却是不一样的。

  • 幻读一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了"幻影"。

mysql 开启事务命令 mysql怎么开启事务_mysql_03

六、事务隔离级别

隔离级别

脏读

不可重复读

幻读

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 ;

注意:事务隔离级别越高,数据越安全,但是性能越低。