mysql事务编号_Mysql事务

一:mysql事务

1.需求

从orders表中查询最新的销售订单编号,并使用下一个销售订单编号作为新的销售订单编号。

在指定客户的orders表中插入新的销售订单。

将新的销售订单项目插入orderdetails表中。

从orders表和orderdetails中获取数据以确认更改。

如果由于数据库故障而导致上述一个或多个步骤失败,那么数据会发生什么? 如果将订单项添加到orderdetails表中的步骤失败,系统中将会有空的销售订单(只有订单号,不知道这个订单卖了什么)。

2.介绍

要启动事务,请使用START TRANSACTION语句。要撤消MySQL语句执行,请使用ROLLBACK语句。

请注意,有一些SQL语句,主要是数据定义语句,不能在事务中使用以下语句:

2fb807ab5a72e300be367cec2c9dd528.png

要将更改写入事务中的数据库,请使用COMMIT语句。要注意的是,默认情况下,MySQL自动提交对数据库的更改。

要强制MySQL不会自动提交更改,请使用以下语句:

e7c60c01fbda95a28617bf0ec143fd79.png

3.需求的步骤

使用START TRANSACTION语句启动事务。

从orders表中获取最新的销售订单编号,并使用下一个销售订单编号作为新的销售订单编号。

在指定orders表中插入新的销售订单。

将新的销售订单项目插入orderdetails表中。

使用COMMIT语句提交更改。

从orders表和orderdetails表中获取数据以确认更改。

4.sql

1 --start a new transaction

2 start transaction;3

4 --get latest order number

5 select @orderNumber := max(orderNUmber)6 fromorders;7 --set new order number

8 set @orderNumber = @orderNumber + 1;9

10 --insert a new order for customer 145

11 insert intoorders(orderNumber,12 orderDate,13 requiredDate,14 shippedDate,15 status,16 customerNumber)17 values(@orderNumber,18 now(),19 date_add(now(), INTERVAL 5 DAY),20 date_add(now(), INTERVAL 2 DAY),21 'In Process',22 145);23 --insert 2 order line items

24 insert intoorderdetails(orderNumber,25 productCode,26 quantityOrdered,27 priceEach,28 orderLineNumber)29 values(@orderNumber,'S18_1749', 30, '136', 1),30 (@orderNumber,'S18_2248', 50, '55.09', 2);31 --commit changes

32 commit;33

34 --get the new inserted order

35 select * fromorders a36 inner join orderdetails b on a.ordernumber =b.ordernumber37 where a.ordernumber = @ordernumber;

5.效果

d07edc9e6e60a05660f714f696ef8028.png

二:表锁定

1.介绍

使用MySQL锁来协调会话之间的表访问。

MySQL允许客户端会话明确获取表锁,以防止其他会话在特定时间段内访问表。客户端会话只能为自己获取或释放表锁。它不能获取或释放其他会话的表锁。

2.准备数据

2f0a7d7f01a89ed02e05d66e96123b55.png

3.lock与unlock语法

lock:

220471eab165959cb117587f300ccd1f.png

可将表的名称放在LOCK TABLES关键字后面,后跟一个锁类型。 MySQL提供两种锁类型:READ和WRITE。 我们将在下一节详细介绍这两种锁类型。

unlock:

da7cdd1f8b2ccb6d5fdd608799715817.png

这个是要释放表的锁。

4.read类型

功能:

同时可以通过多个会话获取表的READ锁。此外,其他会话可以从表中读取数据,而无需获取锁定。

持有READ锁的会话只能从表中读取数据,但不能写入。此外,其他会话在释放READ锁之前无法将数据写入表中。来自另一个会话的写操作将被放入等待状态,直到释放READ锁。

如果会话正常或异常终止,MySQL将会隐式释放所有锁。这也与WRITE锁相关。

示例:

A:获取connection_id

14cca747ac8e98d526ede7a2e46f0693.png

B:插入一行数据

INSERT INTO tbl(col) VALUES(10);

C:获取锁,并添加数据

LOCK TABLE tbl READ;

INSERT INTO tbl(col) VALUES(11);

会报错,因为这个时候不可以添加数据。

95748f4c0214df51aecd72e7526f2088.png

D:打开另一个会话,查看Id

3e1d1c2ae99e3107f2b51236cf5560c2.png

E:插入数据

86386e845bc0a80b11325406c62e153a.png

F:查看详细 信息

7d22651a4bdea3c7e860f1170cfaeb4b.png

G:返回第一个会话,释放read锁

1745a3a2c7a51f26facd7bbf00c93435.png

5.write类型

功能:

只有拥有表锁定的会话才能从表读取和写入数据。

在释放WRITE锁之前,其他会话不能从表中读写。

示例:

A:获取锁,并插入数据

2602c6d15f9ce44ba2e137cf173e71c1.png

这时,去其他会话进行查询数据:

不能读写。

3b81fb7bf21c62c16e80ca587f176c6f.png

B:回到会话一释放锁

UNLOCK TABLES;

C:进入会话二进行操作

这时可以进行读写操作,刚才被锁住的查询可以继续执行。

a044b7b742ed8e550339caf04c284c4f.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值