分布式事务
所谓事务,就是提供一种机制,将一个活动涉及的所有操作纳入到一个不可分割的执行单元,只要其中任何一个操作执行失败,都将导致整个事务的回滚。简单的说,就是一种”要不什么都不做,要么做全套“机制。
数据库本地事务:
ACID原则
A:Atomicity 原子性
C:Consistency 一致性
I:Isolation 隔离性
D:Durability 持久性
而事务的ACID是通过InnoDB日志和锁来保证。事务的隔离性是通过数据库锁的机制实现的,持久性通过redo log(重做日志)来实现,原子性和一致性通过Undo log来实现。
所谓分布式事务,简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。
CAP原则
C(数据强一致性)
A(数据可用性)
P(分区容错性)
三者不可兼得,一般是CP系统或AP系统
宝宝树面试
1、thread sleep()方法与wait()方法的区别
1️⃣sleep方法属于Thread类,而wait属于Object类
2️⃣sleep()方法导致了程序暂停执行指定的时间,让出 cpu 该其他线程,但是他的监控状态依然 保持者,当指定的时间到了又会自动恢复运行状态。
3️⃣在调用 sleep()方法的过程中,线程不会释放对象锁。而当调用 wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此
对象调用 notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。
2、volatile关键字能否杜绝并发
不能,加锁机制(即同步机制)既可以确保可见性又可以确保原子性,而volatile变量只能确保可见性,原因是声明为volatile的简单变量如果当前值与该变量以前的值相关,那么volatile关键字不起作用,也就是说如下的表达式都不是原子操作:“count++”、“count = count+1”。
http://www.importnew.com/23535.html
3、如何优雅的终止一个线程
使用volatile标志位
https://blog.csdn.net/zhangliangzi/article/details/52484302
4、分库分表实现分页查询
5、当两个缓存value比较大,没有超过memcached、redis的value大小范围,且有频繁的读写操作,选用哪个存储
金山云面试
1、redis各种存储结构的性能考虑(什么情况下用相应的存储结构)
2、给定一个数,转换成二进制后,数里面1的个数,从节约时间复杂度方面考虑,怎么做
https://www.cnblogs.com/yihujiu/p/6632320.html
3、数据库事务,当写锁锁定数据后,能否读取该数,在更新过程中,读取的是写入之前的数据还是写入后的数据
https://blog.csdn.net/qq_41376740/article/details/81835713
延伸:数据的脏读、幻读、可重复读
脏读(read uncommitted):在两个事务中,一个事务读到了另一个事务未提交的数据(即事务A读取到事务B修改数据,当事务B未提交数据到数据库或出错时,事务A再进行读取发现数据已修改。例如:将对象放入缓存未同步到数据库,读取数据从缓存中进行读取)。
幻读(READ COMMIT):一个事务读取到另一个事务提交的数据(主要表现为某行数据修改–即事务A在操作前先对数据进行读取,事务B对某行数据进行修改,事务A再次读取数据发现数据已不一致)
可重复读(REPEATABLE READ):在事务提交前读取到的值始终为同一个,但是如果表中出现数据的增加和删除则读取的结果可能会有偏差(例如:事务A统计大于某行大于100数据,第一次统计为10个,此时事务B向表中插入数据,再次进行统计发现已经不是10个)