银行金额mysql怎么存_MySQL

事务4大特性,一致性具体指什么?这4个特性mysql如何保证实现的?

事务的四大特性

原子性:事务由一系列动作组成,整个事务的所有操作,要么全部完成,要么全部不完成

一致性:一旦事务完成,在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏

隔离性:隔离状态执行事务,事务与事务之间互不影响各自的操作和执行

持久性:在事务完成以后,该事务对数据库所作的更改操作便持久的保存在数据库之中,而不是临时的,也不会回滚

Mysql怎么保证一致性的?

从数据库层面,数据库通过原子性、隔离性、持久性来保证一致性。也就是说ACID四大特性之中,C(一致性)是目的,A(原子性)、I(隔离性)、D(持久性)是手段,是为了保证一致性,数据库提供的手段。数据库必须要实现AID三大特性,才有可能实现一致性。例如,原子性无法保证,显然一致性也无法保证。

但是,如果你在事务里故意写出违反约束的代码,一致性还是无法保证的。例如,你在转账的例子中,你的代码里故意不给B账户加钱,那一致性还是无法保证。因此,还必须从应用层角度考虑。

从应用层面,通过代码判断数据库数据是否有效,然后决定回滚还是提交数据!

Mysql怎么保证原子性的?

是利用Innodb的undo log。 undo log名为回滚日志,是实现原子性的关键,当事务回滚时能够撤销所有已经成功执行的sql语句,他需要记录你要回滚的相应日志信息

Mysql怎么保证持久性的?

是利用Innodb的redo log。

采用redo log的好处? 其实好处就是将redo log进行刷盘比对数据页刷盘效率高,具体表现如下

redo log体积小,毕竟只记录了哪一页修改了啥,因此体积小,刷盘快。

redo log是一直往末尾进行追加,属于顺序IO。效率显然比随机IO来的快。

Mysql怎么保证隔离性的?

利用的是锁和MVCC机制。

MVCC,即多版本并发控制(Multi Version Concurrency Control),一个行记录数据有多个版本对快照数据,这些快照数据在undo log中。

如果一个事务读取的行正在做DELELE或者UPDATE操作,读取操作不会等行上的锁释放,而是读取该行的快照版本。

在事务隔离级别为读已提交(Read Commited)时,一个事务能够读到另一个事务已经提交的数据,是不满足隔离性的。但是当事务隔离级别为可重复读(Repeateable Read)中,是满足隔离性的。

事务隔离级别,4个隔离级别分别有什么并发问题?

未提交读:最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读

已提交读:允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生

可重复读:对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生

串行化:最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。

Mysql默认隔离级别?如何保证并发安全?

MySql默认采用可重复读

MySql存储引擎使用的InnoDB,InnoDB支持行级锁和表级锁,默认使用的是行级锁,InnoDB的行级锁有两种:

共享锁:只允许一个事务去读一行,阻止其他事务获取相同数据集的排他锁

排他锁:允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享锁和排他锁<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL 可以用于银行管理系统,下面是一个简单的示例: 假设我们有两个表:账户表和交易表。账户表包含账户号、余额和账户持有人,交易表包含交易号、交易日期、交易金额、发件人账户号和收件人账户号。 下面是创建表的 SQL 语句: ```sql CREATE TABLE account ( account_number INT PRIMARY KEY, balance INT, account_holder VARCHAR(100) ); CREATE TABLE transaction ( transaction_number INT PRIMARY KEY, transaction_date DATE, amount INT, sender_account_number INT, receiver_account_number INT, FOREIGN KEY (sender_account_number) REFERENCES account(account_number), FOREIGN KEY (receiver_account_number) REFERENCES account(account_number) ); ``` 接下来,我们可以向账户表中插入一些数据: ```sql INSERT INTO account (account_number, balance, account_holder) VALUES (1001, 5000, 'John'); INSERT INTO account (account_number, balance, account_holder) VALUES (1002, 10000, 'Mary'); ``` 然后,我们可以向交易表中插入一些数据: ```sql INSERT INTO transaction (transaction_number, transaction_date, amount, sender_account_number, receiver_account_number) VALUES (1, '2021-01-01', 1000, 1001, 1002); INSERT INTO transaction (transaction_number, transaction_date, amount, sender_account_number, receiver_account_number) VALUES (2, '2021-02-01', 2000, 1002, 1001); ``` 最后,我们可以查询账户和交易的信息: ```sql SELECT * FROM account; SELECT * FROM transaction; ``` 当然,这只是一个简单的示例。在实际的银行管理系统中,会有更复杂的业务逻辑和更多的表。但这可以作为一个起点来学习如何使用 MySQL 管理银行数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值