2.事务提交

1.事务提方式

mysql中有两种事务提交方式:

手动提交

自动提交

1.1事务手动提交过程

事务执行成功过程:开启事务->执行多条件SQL语句->成功->事务提交

事务执行失败过程:开启事务->执行多条件SQL语句->失败->事务回滚

1.2语法格式

格式:

starttransaction;#开启事务
commit;#提交事务
rollback;#回滚事务

1.3案例

事务成功提交:模拟张三给李四转500元钱(成功)目前

数据库数据如下:

+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 500 |
| 2 | 李四 | 1500 |
+----+--------+-------+
#开启事务
mysql> start transaction;
Query OK, 0 rows affected (0.01 秒)
#执⾏从张三帐户扣出500元
mysql> update yh set money=money-500 where
name='张三';
Query OK, 1 rows affected (0.01 秒)
#执⾏往李四帐户加⼊500元
mysql> update yh set money=money+500 where
name='李四';
Query OK, 1 rows affected (0.01 秒)
#提交事务
mysql> commit;
Query OK, 0 rows affected (0.08 秒)
#查看帐户
mysql> select * from yh;
+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 0 |
| 2 | 李四 | 2000 |
+----+--------+-------+
2 ⾏于数据集 (0.01 秒)

事务回滚:模拟李四给张三转500元钱(失败)目前数据库

数据如下:

+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 0 |
| 2 | 李四 | 2000 |
+----+--------+-------+
#开启事务
mysql> start transaction;
Query OK, 0 rows affected (0.02 秒)
#执⾏从李四帐户扣出500元
mysql> update yh set money=money-500 where
name='李四';
Query OK, 1 rows affected (0.01 秒)
#执⾏往张三帐户加⼊500元,但是加了600
mysql> update yh set money=money+600 where
name='张三';
Query OK, 1 rows affected (0.01 秒)
#事务回滚
mysql> rollback;
Query OK, 0 rows affected (0.02 秒)
#查看帐户
mysql> select * from yh;
+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 0 |
| 2 | 李四 | 2000 |
+----+--------+-------+
2 ⾏于数据集 (0.01 秒)

2.1事务自动提交

MySQL默认每一条DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,语句执行完毕自动提交事务,MySQL默认开始自动提交事务。

如:事务开始->update/delete/insert into->事务提交

2.2自动提交事务案例

自动事务提交:往张三的账户里存入1000元,目前数据库数据如下:

+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 0 |
| 2 | 李四 | 2000 |
+----+--------+-------+
mysql> update yh set money=money+1000 where
name='张三';
Query OK, 1 rows affected (0.05 秒)
mysql> select * from yh;
+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 1000 |
| 2 | 李四 | 2000 |
+----+--------+-------+
2 ⾏于数据集 (0.01 秒)

2.3取消自动提交

查看MySQL是否开启自动提交事务

格式:

select@@autocommit;

注意:

@@表示全局变量,1表示开启,0表示关闭

取消自动提交事务

格式:

set autocommit=0;

2.3.1案例

mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 1 |
+--------------+
1 ⾏于数据集 (0.01 秒)
mysql> set autocommit=0;
Query OK, 0 rows affected (0.01 秒)
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 0 |
+--------------+
1 ⾏于数据集 (0.01 秒)

从李四的账户取出1000元,目前数据库数据如下:

+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 1000 |
| 2 | 李四 | 2000 |
+----+--------+-------+

注意:

要在窗口A、窗口B中验证

#窗⼝A
mysql> update yh set money=money-1000 where
name='李四';
Query OK, 1 rows affected (0.01 秒)
mysql> select * from yh;
+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 1000 |
| 2 | 李四 | 1000 |
+----+--------+-------+
2 ⾏于数据集 (0.01 秒)
#在窗⼝B中查询银⾏帐户(第⼀次验证)
#提交
mysql> commit;
Query OK, 0 rows affected (0.10 秒)
#在窗⼝B中查询银⾏帐户(第⼆次验证)

在打开一个窗口

#窗⼝B
mysql> select * from yh;
+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 1000 |
| 2 | 李四 | 2000 |
+----+--------+-------+
2 ⾏于数据集 (0.01 秒)
mysql> select * from yh;
+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 1000 |
| 2 | 李四 | 1000 |
+----+--------+-------+
2 ⾏于数据集 (0.02 秒)

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
事务提交是指在分布式系统中,保证多个参与者(节点或服务)的操作在全局事务的上下文中要么全部提交成功,要么全部回滚失败。在分布式系统中,要保证事务的一致性和可靠性,需要采用2阶段提交和3阶段提交这两种事务提交协议。 2阶段提交(Two-Phase Commit,2PC)是一种分布式事务提交协议,它分为两个阶段:准备阶段和提交阶段。在准备阶段,协调者(Coordinator)向所有参与者(Participant)发送“准备提交”的消息,并等待参与者的响应;在提交阶段,如果所有参与者都回复“可以提交”,则协调者发送“提交”消息,否则发送“回滚”消息。2PC协议可以保证事务的一致性和可靠性,但是存在阻塞和单点故障等问题。 3阶段提交(Three-Phase Commit,3PC)协议是对2PC协议的改进,它将2PC协议的准备阶段拆分为两个阶段:CanCommit阶段和PreCommit阶段。在CanCommit阶段,协调者向参与者发送“准备提交”的消息,并等待参与者的响应;在PreCommit阶段,如果所有参与者都回复“可以提交”,则协调者发送“提交”消息,否则发送“回滚”消息。3PC协议可以解决2PC协议存在的阻塞和单点故障问题,但是会增加系统的复杂度和网络通信开销。 总的来说,2阶段提交协议简单易实现,但存在阻塞和单点故障等问题;3阶段提交协议可以解决这些问题,但会增加系统复杂度和通信开销。在实际应用中,需要根据系统的特点和需求来选择合适的事务提交协议。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值