【MySQL】(六)事务的基本操作

1.事务自动提交设置

-- 设置自动提交状态,1:开启,0:关闭
set autocommit=0;
-- 查看当前自动提交状态
show variables like '%autocommit%';

2.事务隔离等级查看及设置

-- 事务隔离等及查看
select @@tx_isolation;
-- 设置read uncommitted级别:
set session transaction isolation level read uncommitted;
-- 设置read committed级别:
set session transaction isolation level read committed;
-- 设置repeatable read级别:
set session transaction isolation level repeatable read;
-- 设置serializable级别:
set session transaction isolation level serializable;

3.基础事务

语法为:begin; commit; rollback;

-- 开启事务,也可以用start transaction
begin ;
-- 数据库 DML
update table set filed = {vlaue} where ...;
-- 提交事务或回滚事务
commit;
rollback;

在commit之前可以进行一次select,查看是否会脏读(需要设置数据库隔离等级为READ_COMMITED以上)。
需要开启新的会话,Navicat开启新的查询窗口,不然查到的是没有commit的数据。

select filed from table where ...;

4.嵌套事务(savepoint)

4.1.基本操作

除了基础语法外,有额外3个语法:

  • 声明一个保存点:savepoint savepoint_name;
  • 回滚到指定保存点:rollback to savepoint_name;
  • 删除指定保存点:release savepoint savepoint_name;
begin;
-- 执行一个insert语句,此时在同一个会话中查询,得到1条数据。
insert into table (fields) values ('v1');
-- 将上面执行的sql保存一个savepoint
savepoint p1;
-- 再执行一次insert,此时2条数据。
insert into table (fields) values ('v2');
savepoint p2;
-- 执行第三次insert,此时3条数据
insert into table (fields) values ('v3');
savepoint p3;
-- 回滚保存点p2,此时会查询到2条数据
ROLLBACK to p2;
-- 再回滚保存点p1,此时会查询到1条数据
ROLLBACK to p1;
-- commit或rollback
commit;

4.2.注意点

  • commit和rollback会删除当前事务中的所有保存点。
  • 保存点是按顺序记录的,用上面的例子来解释,如果回滚到p1,那么p2,p3就会自动删除掉。
  • 同上,如果release了p1,p1后面的保存点都会被删掉。

5.执行中的事务查看

-- 正在执行的事务
select * from INFORMATION_SCHEMA.INNODB_TRX;
-- 当前获取锁的事务
select * from INFORMATION_SCHEMA.INNODB_LOCKS; 
-- 当前等待锁的事务
select * from INFORMATION_SCHEMA.INNODB_LOCK_WAITS; 
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
关于mysql事务处理 public static void StartTransaction(Connection con, String[] sqls) throws Exception { if (sqls == null) { return; } Statement sm = null; try { // 事务开始 System.out.println("事务处理开始!"); con.setAutoCommit(false); // 设置连接不自动提交,即用该连接进行的操作都不更新到数据库 sm = con.createStatement(); // 创建Statement对象 //依次执行传入的SQL语句 for (int i = 0; i < sqls.length; i++) { sm.execute(sqls[i]);// 执行添加事物的语句 } System.out.println("提交事务处理!"); con.commit(); // 提交给数据库处理 System.out.println("事务处理结束!"); // 事务结束 //捕获执行SQL语句组中的异常 } catch (SQLException e) { try { System.out.println("事务执行失败,进行回滚!\n"); con.rollback(); // 若前面某条语句出现异常时,进行回滚,取消前面执行的所有操作 } catch (SQLException e1) { e1.printStackTrace(); } } finally { sm.close(); } } 通常都是上述的写法, 在mysql 不支持事务的时候 , 中间的 setAutoCommit 的事务操作是不是都不生效. 现在innoDB支持 事务了, 上述的 java 代码是否能实现 以下的 事务隔离的 操作, 在修改的时候处于锁定状态 或者 只可以通过存储过程来实现, 单行的锁定 BEGIN; SELECT book_number FROM book WHERE book_id = 123 FOR UPDATE; --这里for update , 以前用Oracle的时候也是有这个行锁 // ... UPDATE book SET book_number = book_number - 1 WHERE book_id = 123; COMMIT;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

挥之以墨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值