(1) 在窗口A中打开事务并更新id为1的记录: begin; update test_1 set username = '111_new' where id = 1; 在窗口B中更新id为1的记录: begin; update test_1 set username = '222_new' where id = 1; 在窗口A中提交: commit; select * from test_1; 出现什么结果?为什么?
时间: 2024-02-29 18:54:32 浏览: 16
在窗口A中打开事务并更新id为1的记录:
begin;
update test_1 set username = '111_new' where id = 1;
在窗口B中更新id为1的记录:
begin;
update test_1 set username = '222_new' where id = 1;
在窗口A中提交:
commit;
最终查看test_1表的数据:
select * from test_1;
可以发现,表中的数据为:
| id | username |
|----|----------|
| 1 | 111_new |
这是因为,在窗口A中先更新了id为1的记录,并在提交前未释放锁。在窗口B中更新同一条记录时,由于此时记录被窗口A锁定,窗口B无法立即更新该记录,必须等待窗口A提交事务后才能进行更新操作。因此,当窗口A提交事务后,窗口B才能执行更新操作,但是窗口B更新的内容被窗口A之前更新的内容所覆盖,最终表中的数据为窗口A更新的数据。
相关问题
2. 事务的并发 同时打开两个可输入命令的查询窗口A和B,模拟两个同时进行的事务。 在窗口A中开启事务并查看test_1数据: begin; select * from test_1; 切换至窗口B开启事务,更新test_1的一条数据并查看结果: begin; update test1 set username = 'Alice' where id = 2; select * from test1; 切换至窗口A查看test_1: select * from test_1; 切换至窗口B提交: commit; 切换至窗口A查看test_1: select * from test_1; commit; 出现什么结果?为什么?
在窗口A中开启事务并查看test_1数据:
begin;
select * from test_1;
在窗口B中也开启事务,并更新test_1的一条数据并查看结果:
begin;
update test1 set username = 'Alice' where id = 2;
select * from test1;
切换至窗口A查看test_1:
select * from test_1;
此时窗口A中查看的test_1表数据并没有发生变化,仍然是:
| id | username |
|----|----------|
| 1 | peter |
切换至窗口B提交事务:
commit;
切换至窗口A查看test_1:
select * from test_1;
在窗口A中查看的test_1表数据仍然没有发生变化,仍然是:
| id | username |
|----|----------|
| 1 | peter |
在窗口A中提交事务:
commit;
最终查看test_1表的数据:
select * from test_1;
可以发现,表中的数据仍然是:
| id | username |
|----|----------|
| 1 | peter |
这是因为,在窗口B中更新的是表test1,而在窗口A中查询的是表test_1,两个窗口之间操作的是不同的表,所以窗口B中的更新操作对窗口A中的查询操作没有影响。
always@(posedge I_clk or negedge I_rst_n) begin if(!I_rst_n) begin S_wendu_int1 <= 4'h0 ; S_wendu_int2 <= 4'h0 ; S_wendu_dec <= 4'h0 ; S_shidu_int1 <= 4'h0 ; S_shidu_int2 <= 4'h0 ; S_shidu_dec <= 4'h0 ; end else if(S_ctrl_cnt == 4'h0) begin S_wendu_int1 <= I_disp_data[23:20] ; S_wendu_int2 <= I_disp_data[19:16] ; S_wendu_dec <= I_disp_data[15:12] ; S_shidu_int1 <= I_disp_data[11: 8] ; S_shidu_int2 <= I_disp_data[ 7: 4] ; S_shidu_dec <= I_disp_data[ 3: 0] ; end else begin S_wendu_int1 <= S_wendu_int1 ; S_wendu_int2 <= S_wendu_int2 ; S_wendu_dec <= S_wendu_dec ; S_shidu_int1 <= S_shidu_int1 ; S_shidu_int2 <= S_shidu_int2 ; S_shidu_dec <= S_shidu_dec ; end end
这是一个 Verilog 的 always 块,描述了一些状态寄存器的更新逻辑。在时钟上升沿或复位下降沿触发时,根据复位信号 I_rst_n 的状态,更新状态寄存器 S_wendu_int1、S_wendu_int2、S_wendu_dec、S_shidu_int1、S_shidu_int2 和 S_shidu_dec 的值。当 S_ctrl_cnt 为 4'h0 时,将从输入信号 I_disp_data 的不同位中获取数据。如果 S_ctrl_cnt 不为 4'h0,则状态寄存器保持原来的值不变。