- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
转账是生活中常见的操作,比如从A账户转账100元到B账号。站在用户角度而言,这是一个逻辑上的单一操作,然而在数据库系统中,至少会分成两个步骤来完成:
在这个过程中可能会出现以下问题:
为了便于解决这些问题,需要引入数据库事务的概念。
原子性(Atomicity):事务的操作是不可分割的,“要么都不执行,要么全部执行”。
一致性(Consistency):事务执行完毕后会将数据库由一个一致性的状态变为另一个一致性的状态,数据库的一致性状态是指数据库中的数据满足完整性约束。
隔离性(Isolation):事务之间应该是彼此独立互不影响的,也就是一个事务的执行不会影响其他事务的执行。
持久性(Durability):事务在被提交(commit)后,它对数据库的改变是永久的(因为修改后的数据将会写入到硬盘中,硬盘会永久保留数据)
一个事务读取了另一个事务未提交的数据
同一事务两次查询读取同一数据,得到的结果不一致。(这是由于查询时系统中同时有其他事务进行操作提交而引起的)
幻读是不可重复读的一种特殊情景 ,A事物删除了2条数据, B事物增加了2条数据,然后A事物查询发现跟没有删除一样,或者一个事物两次范围查询的结果不一样:
读为提交(read uncommitted):事务即使未提交,其他事务也能读
读已提交(read committed):事务只有提交后,其他事务才能读
可重复读(repeatable read):在同一个事务中,重复读取数据的结果也是相同的
可串行化(serializable):串行执行事务,一个事务提交(commit)或回滚(rollback)后,另一个事务才能开始。
注意:mysql的默认隔离级别:可重复读
,mysql在执行事务(dml语句)的时候,会在表上加表锁,防止其他用户修改表中数据。(在执行dml语句时,select语句除外)
在Mysql中使用事物的前提条件必须在创建库的时候设置存储引擎为InnoDB
只有这个存储引擎支持事物
开启事务
-- 开启事务
start transaction; -- 或者直接 BEGIN;
很多的博主都说要先设置set autocommit = 0
关闭掉事务的自动提交属性才能使用 begin/commit或者begin/rollback的原子性操作,这是错误的。关于这一点,mysql官方文档做了详细的解释,下面是我引用的官方文档中的最重要的一句话A session that has autocommit enabled can perform a multiple-statement transaction by starting it with an explicit START TRANSACTION or BEGIN statement and ending it with a COMMIT or ROLLBACK statement.
事务提交/回滚
rollback; -- 回滚
commit; -- 提交
简单的事物操作
start transaction; -- 开启事物
update qian set money = money + 100 where name = 'A';
select * from qian;
rollback; -- 事物回滚
select * from qian;
查看当前会话的隔离级别
-- 查看当前会话的隔离级别
select @@tx_isolation;
设置当前会话的隔离级别
-- 设置当前会话的隔离级别
-- set session transaction isolation level 隔离级别;
-- 举例:
set session transaction isolation level read committed;
回滚点
很多时候,一个事务会包含多条语句,而出现问题需要回滚时,并不一定是要回滚到 begin 之前的状态,有可能是某条语句执行后的状态,这时需要用到savepoint
定义回滚点,rollback 决定回滚到的位置
#开启一个事务
begin;
#更新表中A的money值+100
update qian set money = money + 100 where name = 'A';
select * from qian ;
#创建回滚点S1
SAVEPOINT S1;
#更新表B中的money值+100
update qian set money= money + 100 where name = 'B';
select * from qian;
#创建回滚段S2
SAVEPOINT S2;
#再次插入一条数据记录
insert into qian values(3,'C',1000);
select * from qian ;
ROLLBACK TO S1;
#回滚到回滚点S1
select * from qian;
点赞 -收藏-关注-便于以后复习和收到最新内容有其他问题在评论区讨论-或者私信我-收到会在第一时间回复如有侵权,请私信联系我感谢,配合,希望我的努力对你有帮助^_^
什么是事物 事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这组数据库命令要么都执行,要么都不执行。 事务是一个不可分割的工.作逻辑
什么是范式? 简言之就是,数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系。所以建立科学的,规范的数据库是需要满足一些规范来优化数据数据存储方式。在关系型数据库中这些规范就可以称为范
什么是事物 事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这组数据库命令要么都执行,要么都不执行。 事务是一个不可分割的工.作逻辑
什么是范式? 简言之就是,数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系。所以建立科学的,规范的数据库是需要满足一些规范来优化数据数据存储方式。在关系型数据库中这些规范就可以称为范
我正在尝试修改网站的布局,但有时网站会使用 !important,有没有办法覆盖它?我似乎无法弄清楚如何在页面的 css 文件之后加载 css 内容脚本。 最佳答案 !important CSS 规则
这个问题在这里已经有了答案: How to override !important? (12 个答案) 关闭 9 年前。 我写了一些 html,并在第三方网站中注入(inject)了一些 css 样
好的,我在这里安装了一个 wordpress 主题(www.sullivansuccesscoaching.com/home ...我们需要/home,因为仍然有一个 index.html 隐藏了 w
我已经为我的 Wordpress 模板创建了一个覆盖原始 CSS 的自定义样式表。但是,在我的日历页面上,原始 CSS 具有使用 !important 声明设置的每个表格单元格的高度: td {hei
这个问题在这里已经有了答案: How to document deconstructed parameters with JsDoc (1 个回答) 关闭 5 年前。 我正在努力寻找对文档 ES6
我的网站使用 bootstrap 4 和我制作的 css 文件。 在这个 css 文件的底部,我放置了一些媒体查询: @media (max-width: 575px) { .address .c
可以将 background-position X 设置为 0 带有标志 !important 和背景位置 Y 不带 !important? 例如: background-position-x: 0
我只想在焦点状态下去掉下拉列表中的轮廓。看这张图 我尝试使用 !important 覆盖 Bootstrap ,但根本不起作用。只是检查开发工具,突然看到这个。 Bootstrap 也使用 !impo
这个问题在这里已经有了答案: How to override !important? (12 个答案) 关闭 1 年前。
发生了什么事?:我的 jQuery Accordion 的动画坏了。在关闭上一个选项卡之前短时间单击下一个选项卡后,它会显示之前打开的选项卡。动画也不滑动。 CSS:来自this answer /*
如何使用 javascript 或 CSS 覆盖样式“color: red”?我想让它成为“2px”而不是“1px”边框。 Lorem... 我无法向“div”添加类、id。这不
这个问题在这里已经有了答案: How to override !important? (12 个答案) 关闭 5 年前。
滚动有问题不想显示其内容,如果我这样做 #callCenter { position: fixed; z-index: 2411 !important; display: bl
序言 1、MySQL表操作(创建表,查询表结构,更改表字段等), 2、MySQL的数据类型(CHAR、VARCHAR、BLOB,等), 本节比较重要,对数据表数据进行查询操作,其中可能大
如何将!important添加到客户端包GWT中的gwt-image: 我有这个: @sprite .superButton{ gwt-image : 'superButton'; backg
请帮助我..我想验证表单并使用 ajax 发送。 验证没有 ''onsubmit="return validateForm(this);"'' 工作。 但是当表单正确时,它的发送表单(页面刷新..)请
我是一名优秀的程序员,十分优秀!