Created
January 15, 2022 15:19
-
-
Save zw963/0eeea5e9d361f722c9ccd6e5b68990f8 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env ruby | |
begin | |
require "bundler/inline" | |
rescue LoadError => e | |
$stderr.puts "Bundler version 1.10 or later is required. Please update your Bundler" | |
raise e | |
end | |
gemfile(true) do | |
source "https://rubygems.org" | |
gem 'pg' | |
gem 'sequel' | |
gem 'minitest' | |
gem 'minitest-hooks' | |
end | |
system("sudo -u postgres dropdb --if-exists check_sequel_db") | |
system("sudo -u postgres createdb check_sequel_db") | |
DB = Sequel.postgres("check_sequel_db") | |
DB.create_table(:insiders, :ignore_index_errors=>true) do | |
primary_key :id | |
Integer :number_of_shares, :null=>false | |
end | |
class Insider < Sequel::Model | |
end | |
ENV['RACK_ENV'] = 'test' | |
require 'minitest/autorun' | |
require 'minitest/pride' | |
require 'minitest/hooks/default' | |
class Minitest::HooksSpec | |
def around | |
DB.transaction(:rollback=>:always, :savepoint=>true, :auto_savepoint=>true){super} | |
end | |
def around_all | |
DB.transaction(:rollback=>:always){super} | |
end | |
end | |
require 'logger' | |
LOGGER = Logger.new($stdout) | |
DB.loggers << LOGGER | |
describe 'insider' do | |
before(:all) do | |
Insider.create(number_of_shares: 200) | |
puts "Insider count outer thread: #{Insider.count}" | |
end | |
it 'test postgres read committed mode default lock' do | |
thread1 = Thread.new do | |
sleep rand(0.1..0.2) | |
DB.transaction do | |
puts "Insider count inner first thread: #{Insider.count}" | |
insider_1 = Insider.last | |
insider_1.update(number_of_shares: insider_1.number_of_shares - 10) | |
end | |
end | |
thread2 = Thread.new do | |
sleep rand(0.1..0.2) | |
DB.transaction do | |
insider_2 = Insider.last | |
insider_2.update(number_of_shares: insider_2.number_of_shares - 10) | |
end | |
end | |
thread1.join | |
thread2.join | |
assert_equal 180.0, Insider.last.number_of_shares | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment