怎样给网站做一张背景,代理注册公司代理费多少钱,网站免费申请建站,攀枝花建设规划网站在现实生活中有很多的线上支付的场景,当支付的时候#xff0c;一方资金减少#xff0c;另一方资金增加#xff0c;在执行前后#xff0c;两者的总体数额需要相同#xff0c;为了保证这个操作的完整#xff0c;所以提出了事务#xff0c;那我们先来去写一个示例#xff…在现实生活中有很多的线上支付的场景,当支付的时候一方资金减少另一方资金增加在执行前后两者的总体数额需要相同为了保证这个操作的完整所以提出了事务那我们先来去写一个示例做一个简单的引子吧。
在这里有一个简单的用户表。里面有用户的资金和用户的简单信息。 mysql CREATE TABLE users (- user_id INT PRIMARY KEY,- username VARCHAR(50) UNIQUE,- balance DECIMAL(10, 2)- );
Query OK, 0 rows affected (0.03 sec)
mysql INSERT INTO users (user_id, username, balance) VALUES- (1, user1, 100.00),- (2, user2, 200.00),- (3, user3, 300.00);
Query OK, 3 rows affected (0.02 sec)
Records: 3 Duplicates: 0 Warnings: 0
如果没有事务的话我们会用下面的语句来去改变这个数据库但是如果是大型业务的话可能会有高并发的情况出现这样的话因为写数据库的操作是比较慢的所以可能会导致支付这个场景出现问题。 mysql
mysql -- 2
Query OK, 0 rows affected (0.00 sec)mysql UPDATE users SET balance balance 50.00 WHERE user_id 2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
那么怎么解决呢就提出了事务的概念现在先了解一下事务然后在给出后面的解决方法。
事务的ACID
原子性atomicity 原子性是事务的ACID属性之一指的是事务中的所有操作要么全部执行成功要么全部执行失败不存在部分执行的情况。如果事务中的任何一个操作失败整个事务都会被回滚到之前的状态以确保数据的一致性和完整性。 原子性保证了数据库在并发环境下的正确性。无论是由于系统错误、数据库故障、硬件故障还是用户错误原子性都可以确保数据的一致性。如果事务是原子性的那么数据库将保持在一个一致的状态这是非常重要的尤其是在需要对数据库进行修改的情况下。 使用事务来组织多个操作可以确保这些操作要么全部成功要么全部失败从而保证了数据的完整性
隔离性isolation
隔离性是数据库事务的ACID属性之一它确保在多个并发事务同时执行时每个事务都能够独立地操作数据就好像没有其他事务在同时运行一样。具体来说隔离性要求一个事务的执行不会被其他并发事务的执行所影响即使这些并发事务是在同一时间执行的。
在数据库中隔离性通过事务隔离级别来实现。SQL标准定义了四种事务隔离级别读未提交Read Uncommitted、读已提交Read Committed、可重复读Repeatable Read和串行化Serializable。隔离级别越高事务之间的隔离程度越高但同时也可能会导致性能下降和并发性降低。
总的来说隔离性保证了事务之间的独立性和数据的一致性避免了并发事务之间的相互干扰和数据不一致的情况。
一致性consistency
一致性是数据库事务的ACID属性之一它确保了数据库从一个一致的状态转移到另一个一致的状态。具体而言一致性保证了当事务开始之前和事务结束之后数据库中的数据必须符合所有定义的约束、规则和完整性约束。
在事务中如果数据操作违反了数据库的完整性约束或规则那么事务应该回滚到事务开始之前的状态以保持数据库的一致性。换句话说一致性确保了事务的执行不会使数据库处于一个不一致或无效的状态。
总的来说一致性保证了数据库的数据始终处于一个有效且符合规则的状态无论是在事务开始之前还是事务结束之后。
持久性durability
持久性是数据库事务的ACID属性之一它确保一旦事务被提交所做的修改将永久保存在数据库中并且不会因为系统故障、崩溃或断电等原因而丢失。换句话说持久性保证了事务所做的改变在提交后是永久性的即使在系统故障的情况下也不会丢失。
数据库系统通过使用日志transaction log来实现持久性。在事务进行修改数据库之前系统会将这些修改记录到事务日志中然后再将这些修改应用到数据库中。在事务提交之后系统会确保事务日志中的所有修改已经被成功写入到永久存储介质例如磁盘上这样即使系统发生故障数据库也可以通过重放事务日志来恢复到故障之前的状态。
持久性是确保数据在数据库系统中的长期存储和可靠性的重要保证。它使得用户可以放心地进行数据操作不必担心数据丢失或损坏的风险。
了解了上面的问题之后在后面给出使用事务解决上面问题的方法 -- 开始事务
START TRANSACTION;-- 扣除用户1的余额
UPDATE users SET balance balance - 50.00 WHERE user_id 1;-- 增加用户2的余额
UPDATE users SET balance balance 50.00 WHERE user_id 2;-- 提交事务
COMMIT; 如果其中有任何语句没有执行成功的话整个事务就会回滚然后就可以很好的处理上面问题但是有很多的时候还有一些其他的问题。 隔离级别
上面提到了事务的四种特性那么也有一个比较重要的就是隔离级别。在隔离级别中有四种先基本总结一下这些知识。 读未提交Read Uncommitted在这个隔离级别下一个事务可以读取到其他事务尚未提交的数据这意味着一个事务可以读取到其他事务正在修改的数据可能会导致脏读Dirty Read问题。读未提交是最低的隔离级别它提供了最高的并发性能但是牺牲了数据的一致性和完整性。 读已提交Read Committed在这个隔离级别下一个事务只能读取到其他事务已经提交的数据这样可以避免脏读问题。但是可能会导致不可重复读Non-Repeatable Read问题因为在同一个事务中多次读取同一数据可能会得到不同的结果这是因为其他事务可能在两次读取之间提交了修改。 可重复读Repeatable Read在这个隔离级别下一个事务在执行期间可以多次读取同一数据而不会受到其他事务的影响。这样可以避免不可重复读问题但是可能会导致幻读Phantom Read问题因为在同一个事务中多次读取同一范围的数据可能会得到不同的结果这是因为其他事务可能在两次读取之间插入了新的数据。 串行化Serializable在这个隔离级别下事务之间是完全隔离的一个事务的执行不会受到其他事务的影响这样可以避免脏读、不可重复读和幻读等所有并发问题。但是串行化隔离级别也是最严格的可能会导致并发性能下降因为它要求事务按照严格的顺序执行无法并行处理。
小结
只是简单的总结了一下事务的一些基础特性对于数据库的使用了解这些知识是必不可少的但是底层的原理肯定不是只有如此的简单在后面会讲一下mvcc的一些重要知识点还有WAL的底层还有就是数据库为什么有了redo log还需要有一个bin log。这些知识都是很重要的在后面会慢慢总结。